mirror of
https://github.com/yuzu-emu/ext-boost.git
synced 2024-12-22 08:15:31 +00:00
Merge pull request #4 from yuzu-emu/revert-3-update-boost
Revert "externals: Update boost to 1.72 and add Boost Context"
This commit is contained in:
commit
717900f94b
329
Jamroot
329
Jamroot
|
@ -1,329 +0,0 @@
|
|||
# Copyright Vladimir Prus 2002-2006.
|
||||
# Copyright Dave Abrahams 2005-2006.
|
||||
# Copyright Rene Rivera 2005-2007.
|
||||
# Copyright Douglas Gregor 2005.
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
# Usage:
|
||||
#
|
||||
# b2 [options] [properties] [install|stage]
|
||||
#
|
||||
# Builds and installs Boost.
|
||||
#
|
||||
# Targets and Related Options:
|
||||
#
|
||||
# install Install headers and compiled library files to the
|
||||
# ======= configured locations (below).
|
||||
#
|
||||
# --prefix=<PREFIX> Install architecture independent files here.
|
||||
# Default: C:\Boost on Windows
|
||||
# Default: /usr/local on Unix, Linux, etc.
|
||||
#
|
||||
# --exec-prefix=<EPREFIX> Install architecture dependent files here.
|
||||
# Default: <PREFIX>
|
||||
#
|
||||
# --libdir=<LIBDIR> Install library files here.
|
||||
# Default: <EPREFIX>/lib
|
||||
#
|
||||
# --includedir=<HDRDIR> Install header files here.
|
||||
# Default: <PREFIX>/include
|
||||
#
|
||||
# --cmakedir=<CMAKEDIR> Install CMake configuration files here.
|
||||
# Default: <LIBDIR>/cmake
|
||||
#
|
||||
# --no-cmake-config Do not install CMake configuration files.
|
||||
#
|
||||
# stage Build and install only compiled library files to the
|
||||
# ===== stage directory.
|
||||
#
|
||||
# --stagedir=<STAGEDIR> Install library files here
|
||||
# Default: ./stage
|
||||
#
|
||||
# Other Options:
|
||||
#
|
||||
# --build-type=<type> Build the specified pre-defined set of variations of
|
||||
# the libraries. Note, that which variants get built
|
||||
# depends on what each library supports.
|
||||
#
|
||||
# -- minimal -- (default) Builds a minimal set of
|
||||
# variants. On Windows, these are static
|
||||
# multithreaded libraries in debug and release
|
||||
# modes, using shared runtime. On Linux, these are
|
||||
# static and shared multithreaded libraries in
|
||||
# release mode.
|
||||
#
|
||||
# -- complete -- Build all possible variations.
|
||||
#
|
||||
# --build-dir=DIR Build in this location instead of building within
|
||||
# the distribution tree. Recommended!
|
||||
#
|
||||
# --show-libraries Display the list of Boost libraries that require
|
||||
# build and installation steps, and then exit.
|
||||
#
|
||||
# --layout=<layout> Determine whether to choose library names and header
|
||||
# locations such that multiple versions of Boost or
|
||||
# multiple compilers can be used on the same system.
|
||||
#
|
||||
# -- versioned -- Names of boost binaries include
|
||||
# the Boost version number, name and version of
|
||||
# the compiler and encoded build properties. Boost
|
||||
# headers are installed in a subdirectory of
|
||||
# <HDRDIR> whose name contains the Boost version
|
||||
# number.
|
||||
#
|
||||
# -- tagged -- Names of boost binaries include the
|
||||
# encoded build properties such as variant and
|
||||
# threading, but do not including compiler name
|
||||
# and version, or Boost version. This option is
|
||||
# useful if you build several variants of Boost,
|
||||
# using the same compiler.
|
||||
#
|
||||
# -- system -- Binaries names do not include the
|
||||
# Boost version number or the name and version
|
||||
# number of the compiler. Boost headers are
|
||||
# installed directly into <HDRDIR>. This option is
|
||||
# intended for system integrators building
|
||||
# distribution packages.
|
||||
#
|
||||
# The default value is 'versioned' on Windows, and
|
||||
# 'system' on Unix.
|
||||
#
|
||||
# --buildid=ID Add the specified ID to the name of built libraries.
|
||||
# The default is to not add anything.
|
||||
#
|
||||
# --python-buildid=ID Add the specified ID to the name of built libraries
|
||||
# that depend on Python. The default is to not add
|
||||
# anything. This ID is added in addition to --buildid.
|
||||
#
|
||||
# --help This message.
|
||||
#
|
||||
# --with-<library> Build and install the specified <library>. If this
|
||||
# option is used, only libraries specified using this
|
||||
# option will be built.
|
||||
#
|
||||
# --without-<library> Do not build, stage, or install the specified
|
||||
# <library>. By default, all libraries are built.
|
||||
#
|
||||
# Properties:
|
||||
#
|
||||
# toolset=toolset Indicate the toolset to build with.
|
||||
#
|
||||
# variant=debug|release Select the build variant
|
||||
#
|
||||
# link=static|shared Whether to build static or shared libraries
|
||||
#
|
||||
# threading=single|multi Whether to build single or multithreaded binaries
|
||||
#
|
||||
# runtime-link=static|shared
|
||||
# Whether to link to static or shared C and C++
|
||||
# runtime.
|
||||
#
|
||||
|
||||
# TODO:
|
||||
# - handle boost version
|
||||
# - handle python options such as pydebug
|
||||
|
||||
import boostcpp ;
|
||||
import package ;
|
||||
|
||||
import sequence ;
|
||||
import xsltproc ;
|
||||
import set ;
|
||||
import path ;
|
||||
import link ;
|
||||
import notfile ;
|
||||
import virtual-target ;
|
||||
import "class" : new ;
|
||||
import property-set ;
|
||||
import threadapi-feature ;
|
||||
import option ;
|
||||
# Backslash because of `bcp --namespace`
|
||||
import tools/boost\_install/boost-install ;
|
||||
|
||||
path-constant BOOST_ROOT : . ;
|
||||
constant BOOST_VERSION : 1.72.0 ;
|
||||
constant BOOST_JAMROOT_MODULE : $(__name__) ;
|
||||
|
||||
boostcpp.set-version $(BOOST_VERSION) ;
|
||||
|
||||
use-project /boost/architecture : libs/config/checks/architecture ;
|
||||
|
||||
local all-headers =
|
||||
[ MATCH .*libs/(.*)/include/boost : [ glob libs/*/include/boost libs/*/*/include/boost ] ] ;
|
||||
|
||||
for dir in $(all-headers)
|
||||
{
|
||||
link-directory $(dir)-headers : libs/$(dir)/include/boost : <location>. ;
|
||||
explicit $(dir)-headers ;
|
||||
}
|
||||
|
||||
if $(all-headers)
|
||||
{
|
||||
constant BOOST_MODULARLAYOUT : $(all-headers) ;
|
||||
}
|
||||
|
||||
project boost
|
||||
: requirements <include>.
|
||||
|
||||
[ boostcpp.architecture ]
|
||||
[ boostcpp.address-model ]
|
||||
|
||||
# Disable auto-linking for all targets here, primarily because it caused
|
||||
# troubles with V2.
|
||||
<define>BOOST_ALL_NO_LIB=1
|
||||
# Used to encode variant in target name. See the 'tag' rule below.
|
||||
<tag>@$(__name__).tag
|
||||
<conditional>@handle-static-runtime
|
||||
# Comeau does not support shared lib
|
||||
<toolset>como:<link>static
|
||||
<toolset>como-linux:<define>_GNU_SOURCE=1
|
||||
# When building docs within Boost, we want the standard Boost style
|
||||
<xsl:param>boost.defaults=Boost
|
||||
<conditional>@threadapi-feature.detect
|
||||
: usage-requirements <include>.
|
||||
: default-build
|
||||
<visibility>hidden
|
||||
<threading>multi
|
||||
: build-dir bin.v2
|
||||
;
|
||||
|
||||
# This rule is called by Boost.Build to determine the name of target. We use it
|
||||
# to encode the build variant, compiler name and boost version in the target
|
||||
# name.
|
||||
#
|
||||
rule tag ( name : type ? : property-set )
|
||||
{
|
||||
return [ boostcpp.tag $(name) : $(type) : $(property-set) ] ;
|
||||
}
|
||||
|
||||
rule python-tag ( name : type ? : property-set )
|
||||
{
|
||||
return [ boostcpp.python-tag $(name) : $(type) : $(property-set) ] ;
|
||||
}
|
||||
|
||||
rule handle-static-runtime ( properties * )
|
||||
{
|
||||
# Using static runtime with shared libraries is impossible on Linux, and
|
||||
# dangerous on Windows. Therefore, we disallow it. This might be drastic,
|
||||
# but it was disabled for a while without anybody complaining.
|
||||
|
||||
# For CW, static runtime is needed so that std::locale works.
|
||||
if <link>shared in $(properties) && <runtime-link>static in $(properties) &&
|
||||
! ( <toolset>cw in $(properties) )
|
||||
{
|
||||
if ! $(.shared-static-warning-emitted)
|
||||
{
|
||||
ECHO "warning: skipping configuration link=shared, runtime-link=static" ;
|
||||
ECHO "warning: this combination is either impossible or too dangerous" ;
|
||||
ECHO "warning: to be of any use" ;
|
||||
.shared-static-warning-emitted = 1 ;
|
||||
}
|
||||
|
||||
return <build>no ;
|
||||
}
|
||||
}
|
||||
|
||||
all-libraries = [ MATCH .*libs/(.*)/build/.* : [ glob libs/*/build/Jamfile.v2 ]
|
||||
[ glob libs/*/build/Jamfile ] ] ;
|
||||
|
||||
all-libraries = [ sequence.unique $(all-libraries) ] ;
|
||||
# The function_types library has a Jamfile, but it's used for maintenance
|
||||
# purposes, there's no library to build and install.
|
||||
all-libraries = [ set.difference $(all-libraries) : function_types ] ;
|
||||
|
||||
# Setup convenient aliases for all libraries.
|
||||
|
||||
local rule explicit-alias ( id : targets + )
|
||||
{
|
||||
alias $(id) : $(targets) ;
|
||||
explicit $(id) ;
|
||||
}
|
||||
|
||||
# First, the complicated libraries: where the target name in Jamfile is
|
||||
# different from its directory name.
|
||||
explicit-alias prg_exec_monitor : libs/test/build//boost_prg_exec_monitor ;
|
||||
explicit-alias test_exec_monitor : libs/test/build//boost_test_exec_monitor ;
|
||||
explicit-alias unit_test_framework : libs/test/build//boost_unit_test_framework ;
|
||||
explicit-alias bgl-vis : libs/graps/build//bgl-vis ;
|
||||
explicit-alias serialization : libs/serialization/build//boost_serialization ;
|
||||
explicit-alias wserialization : libs/serialization/build//boost_wserialization ;
|
||||
for local l in $(all-libraries)
|
||||
{
|
||||
if ! $(l) in test graph serialization headers
|
||||
{
|
||||
explicit-alias $(l) : libs/$(l)/build//boost_$(l) ;
|
||||
}
|
||||
}
|
||||
|
||||
# Log has an additional target
|
||||
explicit-alias log_setup : libs/log/build//boost_log_setup ;
|
||||
|
||||
rule do-nothing { }
|
||||
|
||||
rule generate-alias ( project name : property-set : sources * )
|
||||
{
|
||||
local action-name = [ $(property-set).get <action> ] ;
|
||||
local m = [ MATCH ^@(.*) : $(action-name) ] ;
|
||||
property-set = [ property-set.empty ] ;
|
||||
local action = [ new action $(sources) : $(m[1]) : $(property-set) ] ;
|
||||
local t = [ new notfile-target $(name) : $(project) : $(action) ] ;
|
||||
return [ virtual-target.register $(t) ] ;
|
||||
}
|
||||
|
||||
generate headers : $(all-headers)-headers : <generating-rule>@generate-alias <action>@do-nothing : : <include>. ;
|
||||
|
||||
#alias headers : $(all-headers)-headers : : : <include>. ;
|
||||
explicit headers ;
|
||||
|
||||
# Make project ids of all libraries known.
|
||||
for local l in $(all-libraries)
|
||||
{
|
||||
use-project /boost/$(l) : libs/$(l)/build ;
|
||||
}
|
||||
|
||||
if [ path.exists $(BOOST_ROOT)/tools/inspect/build ]
|
||||
{
|
||||
use-project /boost/tools/inspect : tools/inspect/build ;
|
||||
}
|
||||
|
||||
if [ path.exists $(BOOST_ROOT)/libs/wave/tool/build ]
|
||||
{
|
||||
use-project /boost/libs/wave/tool : libs/wave/tool/build ;
|
||||
}
|
||||
|
||||
# Make the boost-install rule visible in subprojects
|
||||
|
||||
# This rule should be called from libraries' Jamfiles and will create two
|
||||
# targets, "install" and "stage", that will install or stage that library. The
|
||||
# --prefix option is respected, but --with and --without options, naturally, are
|
||||
# ignored.
|
||||
#
|
||||
# - libraries -- list of library targets to install.
|
||||
|
||||
rule boost-install ( libraries * )
|
||||
{
|
||||
boost-install.boost-install $(libraries) ;
|
||||
}
|
||||
|
||||
# Creates a library target, adding autolink support and also creates
|
||||
# stage and install targets via boost-install, above.
|
||||
rule boost-lib ( name : sources * : requirements * : default-build * : usage-requirements * )
|
||||
{
|
||||
autolink = <link>shared:<define>BOOST_$(name:U)_DYN_LINK=1 ;
|
||||
name = boost_$(name) ;
|
||||
lib $(name)
|
||||
: $(sources)
|
||||
: $(requirements) $(autolink)
|
||||
: $(default-build)
|
||||
: $(usage-requirements) $(autolink)
|
||||
;
|
||||
boost-install $(name) ;
|
||||
}
|
||||
|
||||
|
||||
# Declare special top-level targets that build and install the desired variants
|
||||
# of the libraries.
|
||||
boostcpp.declare-targets $(all-libraries) ;
|
553
boost/algorithm/minmax_element.hpp
Normal file
553
boost/algorithm/minmax_element.hpp
Normal file
|
@ -0,0 +1,553 @@
|
|||
// (C) Copyright Herve Bronnimann 2004.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
/*
|
||||
Revision history:
|
||||
1 July 2004
|
||||
Split the code into two headers to lessen dependence on
|
||||
Boost.tuple. (Herve)
|
||||
26 June 2004
|
||||
Added the code for the boost minmax library. (Herve)
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ALGORITHM_MINMAX_ELEMENT_HPP
|
||||
#define BOOST_ALGORITHM_MINMAX_ELEMENT_HPP
|
||||
|
||||
/* PROPOSED STANDARD EXTENSIONS:
|
||||
*
|
||||
* minmax_element(first, last)
|
||||
* Effect: std::make_pair( std::min_element(first, last),
|
||||
* std::max_element(first, last) );
|
||||
*
|
||||
* minmax_element(first, last, comp)
|
||||
* Effect: std::make_pair( std::min_element(first, last, comp),
|
||||
* std::max_element(first, last, comp) );
|
||||
*/
|
||||
|
||||
#include <utility> // for std::pair and std::make_pair
|
||||
|
||||
namespace boost {
|
||||
|
||||
namespace detail { // for obtaining a uniform version of minmax_element
|
||||
// that compiles with VC++ 6.0 -- avoid the iterator_traits by
|
||||
// having comparison object over iterator, not over dereferenced value
|
||||
|
||||
template <typename Iterator>
|
||||
struct less_over_iter {
|
||||
bool operator()(Iterator const& it1,
|
||||
Iterator const& it2) const { return *it1 < *it2; }
|
||||
};
|
||||
|
||||
template <typename Iterator, class BinaryPredicate>
|
||||
struct binary_pred_over_iter {
|
||||
explicit binary_pred_over_iter(BinaryPredicate const& p ) : m_p( p ) {}
|
||||
bool operator()(Iterator const& it1,
|
||||
Iterator const& it2) const { return m_p(*it1, *it2); }
|
||||
private:
|
||||
BinaryPredicate m_p;
|
||||
};
|
||||
|
||||
// common base for the two minmax_element overloads
|
||||
|
||||
template <typename ForwardIter, class Compare >
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
basic_minmax_element(ForwardIter first, ForwardIter last, Compare comp)
|
||||
{
|
||||
if (first == last)
|
||||
return std::make_pair(last,last);
|
||||
|
||||
ForwardIter min_result = first;
|
||||
ForwardIter max_result = first;
|
||||
|
||||
// if only one element
|
||||
ForwardIter second = first; ++second;
|
||||
if (second == last)
|
||||
return std::make_pair(min_result, max_result);
|
||||
|
||||
// treat first pair separately (only one comparison for first two elements)
|
||||
ForwardIter potential_min_result = last;
|
||||
if (comp(first, second))
|
||||
max_result = second;
|
||||
else {
|
||||
min_result = second;
|
||||
potential_min_result = first;
|
||||
}
|
||||
|
||||
// then each element by pairs, with at most 3 comparisons per pair
|
||||
first = ++second; if (first != last) ++second;
|
||||
while (second != last) {
|
||||
if (comp(first, second)) {
|
||||
if (comp(first, min_result)) {
|
||||
min_result = first;
|
||||
potential_min_result = last;
|
||||
}
|
||||
if (comp(max_result, second))
|
||||
max_result = second;
|
||||
} else {
|
||||
if (comp(second, min_result)) {
|
||||
min_result = second;
|
||||
potential_min_result = first;
|
||||
}
|
||||
if (comp(max_result, first))
|
||||
max_result = first;
|
||||
}
|
||||
first = ++second;
|
||||
if (first != last) ++second;
|
||||
}
|
||||
|
||||
// if odd number of elements, treat last element
|
||||
if (first != last) { // odd number of elements
|
||||
if (comp(first, min_result)) {
|
||||
min_result = first;
|
||||
potential_min_result = last;
|
||||
}
|
||||
else if (comp(max_result, first))
|
||||
max_result = first;
|
||||
}
|
||||
|
||||
// resolve min_result being incorrect with one extra comparison
|
||||
// (in which case potential_min_result is necessarily the correct result)
|
||||
if (potential_min_result != last
|
||||
&& !comp(min_result, potential_min_result))
|
||||
min_result = potential_min_result;
|
||||
|
||||
return std::make_pair(min_result,max_result);
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename ForwardIter>
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
minmax_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return detail::basic_minmax_element(first, last,
|
||||
detail::less_over_iter<ForwardIter>() );
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
minmax_element(ForwardIter first, ForwardIter last, BinaryPredicate comp)
|
||||
{
|
||||
return detail::basic_minmax_element(first, last,
|
||||
detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* PROPOSED BOOST EXTENSIONS
|
||||
* In the description below, [rfirst,rlast) denotes the reversed range
|
||||
* of [first,last). Even though the iterator type of first and last may
|
||||
* be only a Forward Iterator, it is possible to explain the semantics
|
||||
* by assuming that it is a Bidirectional Iterator. In the sequel,
|
||||
* reverse(ForwardIterator&) returns the reverse_iterator adaptor.
|
||||
* This is not how the functions would be implemented!
|
||||
*
|
||||
* first_min_element(first, last)
|
||||
* Effect: std::min_element(first, last);
|
||||
*
|
||||
* first_min_element(first, last, comp)
|
||||
* Effect: std::min_element(first, last, comp);
|
||||
*
|
||||
* last_min_element(first, last)
|
||||
* Effect: reverse( std::min_element(reverse(last), reverse(first)) );
|
||||
*
|
||||
* last_min_element(first, last, comp)
|
||||
* Effect: reverse( std::min_element(reverse(last), reverse(first), comp) );
|
||||
*
|
||||
* first_max_element(first, last)
|
||||
* Effect: std::max_element(first, last);
|
||||
*
|
||||
* first_max_element(first, last, comp)
|
||||
* Effect: max_element(first, last);
|
||||
*
|
||||
* last_max_element(first, last)
|
||||
* Effect: reverse( std::max_element(reverse(last), reverse(first)) );
|
||||
*
|
||||
* last_max_element(first, last, comp)
|
||||
* Effect: reverse( std::max_element(reverse(last), reverse(first), comp) );
|
||||
*
|
||||
* first_min_first_max_element(first, last)
|
||||
* Effect: std::make_pair( first_min_element(first, last),
|
||||
* first_max_element(first, last) );
|
||||
*
|
||||
* first_min_first_max_element(first, last, comp)
|
||||
* Effect: std::make_pair( first_min_element(first, last, comp),
|
||||
* first_max_element(first, last, comp) );
|
||||
*
|
||||
* first_min_last_max_element(first, last)
|
||||
* Effect: std::make_pair( first_min_element(first, last),
|
||||
* last_max_element(first, last) );
|
||||
*
|
||||
* first_min_last_max_element(first, last, comp)
|
||||
* Effect: std::make_pair( first_min_element(first, last, comp),
|
||||
* last_max_element(first, last, comp) );
|
||||
*
|
||||
* last_min_first_max_element(first, last)
|
||||
* Effect: std::make_pair( last_min_element(first, last),
|
||||
* first_max_element(first, last) );
|
||||
*
|
||||
* last_min_first_max_element(first, last, comp)
|
||||
* Effect: std::make_pair( last_min_element(first, last, comp),
|
||||
* first_max_element(first, last, comp) );
|
||||
*
|
||||
* last_min_last_max_element(first, last)
|
||||
* Effect: std::make_pair( last_min_element(first, last),
|
||||
* last_max_element(first, last) );
|
||||
*
|
||||
* last_min_last_max_element(first, last, comp)
|
||||
* Effect: std::make_pair( last_min_element(first, last, comp),
|
||||
* last_max_element(first, last, comp) );
|
||||
*/
|
||||
|
||||
namespace boost {
|
||||
|
||||
// Min_element and max_element variants
|
||||
|
||||
namespace detail { // common base for the overloads
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
ForwardIter
|
||||
basic_first_min_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
if (first == last) return last;
|
||||
ForwardIter min_result = first;
|
||||
while (++first != last)
|
||||
if (comp(first, min_result))
|
||||
min_result = first;
|
||||
return min_result;
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
ForwardIter
|
||||
basic_last_min_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
if (first == last) return last;
|
||||
ForwardIter min_result = first;
|
||||
while (++first != last)
|
||||
if (!comp(min_result, first))
|
||||
min_result = first;
|
||||
return min_result;
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
ForwardIter
|
||||
basic_first_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
if (first == last) return last;
|
||||
ForwardIter max_result = first;
|
||||
while (++first != last)
|
||||
if (comp(max_result, first))
|
||||
max_result = first;
|
||||
return max_result;
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
ForwardIter
|
||||
basic_last_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
if (first == last) return last;
|
||||
ForwardIter max_result = first;
|
||||
while (++first != last)
|
||||
if (!comp(first, max_result))
|
||||
max_result = first;
|
||||
return max_result;
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename ForwardIter>
|
||||
ForwardIter
|
||||
first_min_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return detail::basic_first_min_element(first, last,
|
||||
detail::less_over_iter<ForwardIter>() );
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
ForwardIter
|
||||
first_min_element(ForwardIter first, ForwardIter last, BinaryPredicate comp)
|
||||
{
|
||||
return detail::basic_first_min_element(first, last,
|
||||
detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) );
|
||||
}
|
||||
|
||||
template <typename ForwardIter>
|
||||
ForwardIter
|
||||
last_min_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return detail::basic_last_min_element(first, last,
|
||||
detail::less_over_iter<ForwardIter>() );
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
ForwardIter
|
||||
last_min_element(ForwardIter first, ForwardIter last, BinaryPredicate comp)
|
||||
{
|
||||
return detail::basic_last_min_element(first, last,
|
||||
detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) );
|
||||
}
|
||||
|
||||
template <typename ForwardIter>
|
||||
ForwardIter
|
||||
first_max_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return detail::basic_first_max_element(first, last,
|
||||
detail::less_over_iter<ForwardIter>() );
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
ForwardIter
|
||||
first_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp)
|
||||
{
|
||||
return detail::basic_first_max_element(first, last,
|
||||
detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) );
|
||||
}
|
||||
|
||||
template <typename ForwardIter>
|
||||
ForwardIter
|
||||
last_max_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return detail::basic_last_max_element(first, last,
|
||||
detail::less_over_iter<ForwardIter>() );
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
ForwardIter
|
||||
last_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp)
|
||||
{
|
||||
return detail::basic_last_max_element(first, last,
|
||||
detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) );
|
||||
}
|
||||
|
||||
|
||||
// Minmax_element variants -- comments removed
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
basic_first_min_last_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
if (first == last)
|
||||
return std::make_pair(last,last);
|
||||
|
||||
ForwardIter min_result = first;
|
||||
ForwardIter max_result = first;
|
||||
|
||||
ForwardIter second = ++first;
|
||||
if (second == last)
|
||||
return std::make_pair(min_result, max_result);
|
||||
|
||||
if (comp(second, min_result))
|
||||
min_result = second;
|
||||
else
|
||||
max_result = second;
|
||||
|
||||
first = ++second; if (first != last) ++second;
|
||||
while (second != last) {
|
||||
if (!comp(second, first)) {
|
||||
if (comp(first, min_result))
|
||||
min_result = first;
|
||||
if (!comp(second, max_result))
|
||||
max_result = second;
|
||||
} else {
|
||||
if (comp(second, min_result))
|
||||
min_result = second;
|
||||
if (!comp(first, max_result))
|
||||
max_result = first;
|
||||
}
|
||||
first = ++second; if (first != last) ++second;
|
||||
}
|
||||
|
||||
if (first != last) {
|
||||
if (comp(first, min_result))
|
||||
min_result = first;
|
||||
else if (!comp(first, max_result))
|
||||
max_result = first;
|
||||
}
|
||||
|
||||
return std::make_pair(min_result, max_result);
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
basic_last_min_first_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
if (first == last) return std::make_pair(last,last);
|
||||
|
||||
ForwardIter min_result = first;
|
||||
ForwardIter max_result = first;
|
||||
|
||||
ForwardIter second = ++first;
|
||||
if (second == last)
|
||||
return std::make_pair(min_result, max_result);
|
||||
|
||||
if (comp(max_result, second))
|
||||
max_result = second;
|
||||
else
|
||||
min_result = second;
|
||||
|
||||
first = ++second; if (first != last) ++second;
|
||||
while (second != last) {
|
||||
if (comp(first, second)) {
|
||||
if (!comp(min_result, first))
|
||||
min_result = first;
|
||||
if (comp(max_result, second))
|
||||
max_result = second;
|
||||
} else {
|
||||
if (!comp(min_result, second))
|
||||
min_result = second;
|
||||
if (comp(max_result, first))
|
||||
max_result = first;
|
||||
}
|
||||
first = ++second; if (first != last) ++second;
|
||||
}
|
||||
|
||||
if (first != last) {
|
||||
if (!comp(min_result, first))
|
||||
min_result = first;
|
||||
else if (comp(max_result, first))
|
||||
max_result = first;
|
||||
}
|
||||
|
||||
return std::make_pair(min_result, max_result);
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
basic_last_min_last_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
if (first == last) return std::make_pair(last,last);
|
||||
|
||||
ForwardIter min_result = first;
|
||||
ForwardIter max_result = first;
|
||||
|
||||
ForwardIter second = first; ++second;
|
||||
if (second == last)
|
||||
return std::make_pair(min_result,max_result);
|
||||
|
||||
ForwardIter potential_max_result = last;
|
||||
if (comp(first, second))
|
||||
max_result = second;
|
||||
else {
|
||||
min_result = second;
|
||||
potential_max_result = second;
|
||||
}
|
||||
|
||||
first = ++second; if (first != last) ++second;
|
||||
while (second != last) {
|
||||
if (comp(first, second)) {
|
||||
if (!comp(min_result, first))
|
||||
min_result = first;
|
||||
if (!comp(second, max_result)) {
|
||||
max_result = second;
|
||||
potential_max_result = last;
|
||||
}
|
||||
} else {
|
||||
if (!comp(min_result, second))
|
||||
min_result = second;
|
||||
if (!comp(first, max_result)) {
|
||||
max_result = first;
|
||||
potential_max_result = second;
|
||||
}
|
||||
}
|
||||
first = ++second;
|
||||
if (first != last) ++second;
|
||||
}
|
||||
|
||||
if (first != last) {
|
||||
if (!comp(min_result, first))
|
||||
min_result = first;
|
||||
if (!comp(first, max_result)) {
|
||||
max_result = first;
|
||||
potential_max_result = last;
|
||||
}
|
||||
}
|
||||
|
||||
if (potential_max_result != last
|
||||
&& !comp(potential_max_result, max_result))
|
||||
max_result = potential_max_result;
|
||||
|
||||
return std::make_pair(min_result,max_result);
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename ForwardIter>
|
||||
inline std::pair<ForwardIter,ForwardIter>
|
||||
first_min_first_max_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return minmax_element(first, last);
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
inline std::pair<ForwardIter,ForwardIter>
|
||||
first_min_first_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
return minmax_element(first, last, comp);
|
||||
}
|
||||
|
||||
template <typename ForwardIter>
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
first_min_last_max_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return detail::basic_first_min_last_max_element(first, last,
|
||||
detail::less_over_iter<ForwardIter>() );
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
inline std::pair<ForwardIter,ForwardIter>
|
||||
first_min_last_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
return detail::basic_first_min_last_max_element(first, last,
|
||||
detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) );
|
||||
}
|
||||
|
||||
template <typename ForwardIter>
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
last_min_first_max_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return detail::basic_last_min_first_max_element(first, last,
|
||||
detail::less_over_iter<ForwardIter>() );
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
inline std::pair<ForwardIter,ForwardIter>
|
||||
last_min_first_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
return detail::basic_last_min_first_max_element(first, last,
|
||||
detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) );
|
||||
}
|
||||
|
||||
template <typename ForwardIter>
|
||||
std::pair<ForwardIter,ForwardIter>
|
||||
last_min_last_max_element(ForwardIter first, ForwardIter last)
|
||||
{
|
||||
return detail::basic_last_min_last_max_element(first, last,
|
||||
detail::less_over_iter<ForwardIter>() );
|
||||
}
|
||||
|
||||
template <typename ForwardIter, class BinaryPredicate>
|
||||
inline std::pair<ForwardIter,ForwardIter>
|
||||
last_min_last_max_element(ForwardIter first, ForwardIter last,
|
||||
BinaryPredicate comp)
|
||||
{
|
||||
return detail::basic_last_min_last_max_element(first, last,
|
||||
detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) );
|
||||
}
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_ALGORITHM_MINMAX_ELEMENT_HPP
|
|
@ -1,312 +0,0 @@
|
|||
// Boost string_algo library classification.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2003.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_CLASSIFICATION_HPP
|
||||
#define BOOST_STRING_CLASSIFICATION_HPP
|
||||
|
||||
#include <algorithm>
|
||||
#include <locale>
|
||||
#include <boost/range/value_type.hpp>
|
||||
#include <boost/range/as_literal.hpp>
|
||||
#include <boost/algorithm/string/detail/classification.hpp>
|
||||
#include <boost/algorithm/string/predicate_facade.hpp>
|
||||
|
||||
|
||||
/*! \file
|
||||
Classification predicates are included in the library to give
|
||||
some more convenience when using algorithms like \c trim() and \c all().
|
||||
They wrap functionality of STL classification functions ( e.g. \c std::isspace() )
|
||||
into generic functors.
|
||||
*/
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
|
||||
// classification functor generator -------------------------------------//
|
||||
|
||||
//! is_classified predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate. This predicate holds if the input is
|
||||
of specified \c std::ctype category.
|
||||
|
||||
\param Type A \c std::ctype category
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_classified(std::ctype_base::mask Type, const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(Type, Loc);
|
||||
}
|
||||
|
||||
//! is_space predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::space category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_space(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::space, Loc);
|
||||
}
|
||||
|
||||
//! is_alnum predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::alnum category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_alnum(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::alnum, Loc);
|
||||
}
|
||||
|
||||
//! is_alpha predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::alpha category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_alpha(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::alpha, Loc);
|
||||
}
|
||||
|
||||
//! is_cntrl predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::cntrl category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_cntrl(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::cntrl, Loc);
|
||||
}
|
||||
|
||||
//! is_digit predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::digit category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_digit(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::digit, Loc);
|
||||
}
|
||||
|
||||
//! is_graph predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::graph category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_graph(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::graph, Loc);
|
||||
}
|
||||
|
||||
//! is_lower predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::lower category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_lower(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::lower, Loc);
|
||||
}
|
||||
|
||||
//! is_print predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::print category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_print(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::print, Loc);
|
||||
}
|
||||
|
||||
//! is_punct predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::punct category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_punct(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::punct, Loc);
|
||||
}
|
||||
|
||||
//! is_upper predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::upper category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_upper(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::upper, Loc);
|
||||
}
|
||||
|
||||
//! is_xdigit predicate
|
||||
/*!
|
||||
Construct the \c is_classified predicate for the \c ctype_base::xdigit category.
|
||||
|
||||
\param Loc A locale used for classification
|
||||
\return An instance of the \c is_classified predicate
|
||||
*/
|
||||
inline detail::is_classifiedF
|
||||
is_xdigit(const std::locale& Loc=std::locale())
|
||||
{
|
||||
return detail::is_classifiedF(std::ctype_base::xdigit, Loc);
|
||||
}
|
||||
|
||||
//! is_any_of predicate
|
||||
/*!
|
||||
Construct the \c is_any_of predicate. The predicate holds if the input
|
||||
is included in the specified set of characters.
|
||||
|
||||
\param Set A set of characters to be recognized
|
||||
\return An instance of the \c is_any_of predicate
|
||||
*/
|
||||
template<typename RangeT>
|
||||
inline detail::is_any_ofF<
|
||||
BOOST_STRING_TYPENAME range_value<RangeT>::type>
|
||||
is_any_of( const RangeT& Set )
|
||||
{
|
||||
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_set(boost::as_literal(Set));
|
||||
return detail::is_any_ofF<BOOST_STRING_TYPENAME range_value<RangeT>::type>(lit_set);
|
||||
}
|
||||
|
||||
//! is_from_range predicate
|
||||
/*!
|
||||
Construct the \c is_from_range predicate. The predicate holds if the input
|
||||
is included in the specified range. (i.e. From <= Ch <= To )
|
||||
|
||||
\param From The start of the range
|
||||
\param To The end of the range
|
||||
\return An instance of the \c is_from_range predicate
|
||||
*/
|
||||
template<typename CharT>
|
||||
inline detail::is_from_rangeF<CharT> is_from_range(CharT From, CharT To)
|
||||
{
|
||||
return detail::is_from_rangeF<CharT>(From,To);
|
||||
}
|
||||
|
||||
// predicate combinators ---------------------------------------------------//
|
||||
|
||||
//! predicate 'and' composition predicate
|
||||
/*!
|
||||
Construct the \c class_and predicate. This predicate can be used
|
||||
to logically combine two classification predicates. \c class_and holds,
|
||||
if both predicates return true.
|
||||
|
||||
\param Pred1 The first predicate
|
||||
\param Pred2 The second predicate
|
||||
\return An instance of the \c class_and predicate
|
||||
*/
|
||||
template<typename Pred1T, typename Pred2T>
|
||||
inline detail::pred_andF<Pred1T, Pred2T>
|
||||
operator&&(
|
||||
const predicate_facade<Pred1T>& Pred1,
|
||||
const predicate_facade<Pred2T>& Pred2 )
|
||||
{
|
||||
// Doing the static_cast with the pointer instead of the reference
|
||||
// is a workaround for some compilers which have problems with
|
||||
// static_cast's of template references, i.e. CW8. /grafik/
|
||||
return detail::pred_andF<Pred1T,Pred2T>(
|
||||
*static_cast<const Pred1T*>(&Pred1),
|
||||
*static_cast<const Pred2T*>(&Pred2) );
|
||||
}
|
||||
|
||||
//! predicate 'or' composition predicate
|
||||
/*!
|
||||
Construct the \c class_or predicate. This predicate can be used
|
||||
to logically combine two classification predicates. \c class_or holds,
|
||||
if one of the predicates return true.
|
||||
|
||||
\param Pred1 The first predicate
|
||||
\param Pred2 The second predicate
|
||||
\return An instance of the \c class_or predicate
|
||||
*/
|
||||
template<typename Pred1T, typename Pred2T>
|
||||
inline detail::pred_orF<Pred1T, Pred2T>
|
||||
operator||(
|
||||
const predicate_facade<Pred1T>& Pred1,
|
||||
const predicate_facade<Pred2T>& Pred2 )
|
||||
{
|
||||
// Doing the static_cast with the pointer instead of the reference
|
||||
// is a workaround for some compilers which have problems with
|
||||
// static_cast's of template references, i.e. CW8. /grafik/
|
||||
return detail::pred_orF<Pred1T,Pred2T>(
|
||||
*static_cast<const Pred1T*>(&Pred1),
|
||||
*static_cast<const Pred2T*>(&Pred2));
|
||||
}
|
||||
|
||||
//! predicate negation operator
|
||||
/*!
|
||||
Construct the \c class_not predicate. This predicate represents a negation.
|
||||
\c class_or holds if of the predicates return false.
|
||||
|
||||
\param Pred The predicate to be negated
|
||||
\return An instance of the \c class_not predicate
|
||||
*/
|
||||
template<typename PredT>
|
||||
inline detail::pred_notF<PredT>
|
||||
operator!( const predicate_facade<PredT>& Pred )
|
||||
{
|
||||
// Doing the static_cast with the pointer instead of the reference
|
||||
// is a workaround for some compilers which have problems with
|
||||
// static_cast's of template references, i.e. CW8. /grafik/
|
||||
return detail::pred_notF<PredT>(*static_cast<const PredT*>(&Pred));
|
||||
}
|
||||
|
||||
} // namespace algorithm
|
||||
|
||||
// pull names to the boost namespace
|
||||
using algorithm::is_classified;
|
||||
using algorithm::is_space;
|
||||
using algorithm::is_alnum;
|
||||
using algorithm::is_alpha;
|
||||
using algorithm::is_cntrl;
|
||||
using algorithm::is_digit;
|
||||
using algorithm::is_graph;
|
||||
using algorithm::is_lower;
|
||||
using algorithm::is_upper;
|
||||
using algorithm::is_print;
|
||||
using algorithm::is_punct;
|
||||
using algorithm::is_xdigit;
|
||||
using algorithm::is_any_of;
|
||||
using algorithm::is_from_range;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_STRING_PREDICATE_HPP
|
|
@ -1,353 +0,0 @@
|
|||
// Boost string_algo library classification.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2003.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_CLASSIFICATION_DETAIL_HPP
|
||||
#define BOOST_STRING_CLASSIFICATION_DETAIL_HPP
|
||||
|
||||
#include <boost/algorithm/string/config.hpp>
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <locale>
|
||||
|
||||
#include <boost/range/begin.hpp>
|
||||
#include <boost/range/end.hpp>
|
||||
|
||||
#include <boost/algorithm/string/predicate_facade.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
namespace detail {
|
||||
|
||||
// classification functors -----------------------------------------------//
|
||||
|
||||
// is_classified functor
|
||||
struct is_classifiedF :
|
||||
public predicate_facade<is_classifiedF>
|
||||
{
|
||||
// Boost.ResultOf support
|
||||
typedef bool result_type;
|
||||
|
||||
// Constructor from a locale
|
||||
is_classifiedF(std::ctype_base::mask Type, std::locale const & Loc = std::locale()) :
|
||||
m_Type(Type), m_Locale(Loc) {}
|
||||
// Operation
|
||||
template<typename CharT>
|
||||
bool operator()( CharT Ch ) const
|
||||
{
|
||||
return std::use_facet< std::ctype<CharT> >(m_Locale).is( m_Type, Ch );
|
||||
}
|
||||
|
||||
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x582) && !defined(_USE_OLD_RW_STL)
|
||||
template<>
|
||||
bool operator()( char const Ch ) const
|
||||
{
|
||||
return std::use_facet< std::ctype<char> >(m_Locale).is( m_Type, Ch );
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
std::ctype_base::mask m_Type;
|
||||
std::locale m_Locale;
|
||||
};
|
||||
|
||||
|
||||
// is_any_of functor
|
||||
/*
|
||||
returns true if the value is from the specified set
|
||||
*/
|
||||
template<typename CharT>
|
||||
struct is_any_ofF :
|
||||
public predicate_facade<is_any_ofF<CharT> >
|
||||
{
|
||||
private:
|
||||
// set cannot operate on const value-type
|
||||
typedef typename ::boost::remove_const<CharT>::type set_value_type;
|
||||
|
||||
public:
|
||||
// Boost.ResultOf support
|
||||
typedef bool result_type;
|
||||
|
||||
// Constructor
|
||||
template<typename RangeT>
|
||||
is_any_ofF( const RangeT& Range ) : m_Size(0)
|
||||
{
|
||||
// Prepare storage
|
||||
m_Storage.m_dynSet=0;
|
||||
|
||||
std::size_t Size=::boost::distance(Range);
|
||||
m_Size=Size;
|
||||
set_value_type* Storage=0;
|
||||
|
||||
if(use_fixed_storage(m_Size))
|
||||
{
|
||||
// Use fixed storage
|
||||
Storage=&m_Storage.m_fixSet[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use dynamic storage
|
||||
m_Storage.m_dynSet=new set_value_type[m_Size];
|
||||
Storage=m_Storage.m_dynSet;
|
||||
}
|
||||
|
||||
// Use fixed storage
|
||||
::std::copy(::boost::begin(Range), ::boost::end(Range), Storage);
|
||||
::std::sort(Storage, Storage+m_Size);
|
||||
}
|
||||
|
||||
// Copy constructor
|
||||
is_any_ofF(const is_any_ofF& Other) : m_Size(Other.m_Size)
|
||||
{
|
||||
// Prepare storage
|
||||
m_Storage.m_dynSet=0;
|
||||
const set_value_type* SrcStorage=0;
|
||||
set_value_type* DestStorage=0;
|
||||
|
||||
if(use_fixed_storage(m_Size))
|
||||
{
|
||||
// Use fixed storage
|
||||
DestStorage=&m_Storage.m_fixSet[0];
|
||||
SrcStorage=&Other.m_Storage.m_fixSet[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use dynamic storage
|
||||
m_Storage.m_dynSet=new set_value_type[m_Size];
|
||||
DestStorage=m_Storage.m_dynSet;
|
||||
SrcStorage=Other.m_Storage.m_dynSet;
|
||||
}
|
||||
|
||||
// Use fixed storage
|
||||
::std::memcpy(DestStorage, SrcStorage, sizeof(set_value_type)*m_Size);
|
||||
}
|
||||
|
||||
// Destructor
|
||||
~is_any_ofF()
|
||||
{
|
||||
if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0)
|
||||
{
|
||||
delete [] m_Storage.m_dynSet;
|
||||
}
|
||||
}
|
||||
|
||||
// Assignment
|
||||
is_any_ofF& operator=(const is_any_ofF& Other)
|
||||
{
|
||||
// Handle self assignment
|
||||
if(this==&Other) return *this;
|
||||
|
||||
// Prepare storage
|
||||
const set_value_type* SrcStorage;
|
||||
set_value_type* DestStorage;
|
||||
|
||||
if(use_fixed_storage(Other.m_Size))
|
||||
{
|
||||
// Use fixed storage
|
||||
DestStorage=&m_Storage.m_fixSet[0];
|
||||
SrcStorage=&Other.m_Storage.m_fixSet[0];
|
||||
|
||||
// Delete old storage if was present
|
||||
if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0)
|
||||
{
|
||||
delete [] m_Storage.m_dynSet;
|
||||
}
|
||||
|
||||
// Set new size
|
||||
m_Size=Other.m_Size;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Other uses dynamic storage
|
||||
SrcStorage=Other.m_Storage.m_dynSet;
|
||||
|
||||
// Check what kind of storage are we using right now
|
||||
if(use_fixed_storage(m_Size))
|
||||
{
|
||||
// Using fixed storage, allocate new
|
||||
set_value_type* pTemp=new set_value_type[Other.m_Size];
|
||||
DestStorage=pTemp;
|
||||
m_Storage.m_dynSet=pTemp;
|
||||
m_Size=Other.m_Size;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Using dynamic storage, check if can reuse
|
||||
if(m_Storage.m_dynSet!=0 && m_Size>=Other.m_Size && m_Size<Other.m_Size*2)
|
||||
{
|
||||
// Reuse the current storage
|
||||
DestStorage=m_Storage.m_dynSet;
|
||||
m_Size=Other.m_Size;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Allocate the new one
|
||||
set_value_type* pTemp=new set_value_type[Other.m_Size];
|
||||
DestStorage=pTemp;
|
||||
|
||||
// Delete old storage if necessary
|
||||
if(m_Storage.m_dynSet!=0)
|
||||
{
|
||||
delete [] m_Storage.m_dynSet;
|
||||
}
|
||||
// Store the new storage
|
||||
m_Storage.m_dynSet=pTemp;
|
||||
// Set new size
|
||||
m_Size=Other.m_Size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Copy the data
|
||||
::std::memcpy(DestStorage, SrcStorage, sizeof(set_value_type)*m_Size);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Operation
|
||||
template<typename Char2T>
|
||||
bool operator()( Char2T Ch ) const
|
||||
{
|
||||
const set_value_type* Storage=
|
||||
(use_fixed_storage(m_Size))
|
||||
? &m_Storage.m_fixSet[0]
|
||||
: m_Storage.m_dynSet;
|
||||
|
||||
return ::std::binary_search(Storage, Storage+m_Size, Ch);
|
||||
}
|
||||
private:
|
||||
// check if the size is eligible for fixed storage
|
||||
static bool use_fixed_storage(std::size_t size)
|
||||
{
|
||||
return size<=sizeof(set_value_type*)*2;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
// storage
|
||||
// The actual used storage is selected on the type
|
||||
union
|
||||
{
|
||||
set_value_type* m_dynSet;
|
||||
set_value_type m_fixSet[sizeof(set_value_type*)*2];
|
||||
}
|
||||
m_Storage;
|
||||
|
||||
// storage size
|
||||
::std::size_t m_Size;
|
||||
};
|
||||
|
||||
// is_from_range functor
|
||||
/*
|
||||
returns true if the value is from the specified range.
|
||||
(i.e. x>=From && x>=To)
|
||||
*/
|
||||
template<typename CharT>
|
||||
struct is_from_rangeF :
|
||||
public predicate_facade< is_from_rangeF<CharT> >
|
||||
{
|
||||
// Boost.ResultOf support
|
||||
typedef bool result_type;
|
||||
|
||||
// Constructor
|
||||
is_from_rangeF( CharT From, CharT To ) : m_From(From), m_To(To) {}
|
||||
|
||||
// Operation
|
||||
template<typename Char2T>
|
||||
bool operator()( Char2T Ch ) const
|
||||
{
|
||||
return ( m_From <= Ch ) && ( Ch <= m_To );
|
||||
}
|
||||
|
||||
private:
|
||||
CharT m_From;
|
||||
CharT m_To;
|
||||
};
|
||||
|
||||
// class_and composition predicate
|
||||
template<typename Pred1T, typename Pred2T>
|
||||
struct pred_andF :
|
||||
public predicate_facade< pred_andF<Pred1T,Pred2T> >
|
||||
{
|
||||
public:
|
||||
|
||||
// Boost.ResultOf support
|
||||
typedef bool result_type;
|
||||
|
||||
// Constructor
|
||||
pred_andF( Pred1T Pred1, Pred2T Pred2 ) :
|
||||
m_Pred1(Pred1), m_Pred2(Pred2) {}
|
||||
|
||||
// Operation
|
||||
template<typename CharT>
|
||||
bool operator()( CharT Ch ) const
|
||||
{
|
||||
return m_Pred1(Ch) && m_Pred2(Ch);
|
||||
}
|
||||
|
||||
private:
|
||||
Pred1T m_Pred1;
|
||||
Pred2T m_Pred2;
|
||||
};
|
||||
|
||||
// class_or composition predicate
|
||||
template<typename Pred1T, typename Pred2T>
|
||||
struct pred_orF :
|
||||
public predicate_facade< pred_orF<Pred1T,Pred2T> >
|
||||
{
|
||||
public:
|
||||
// Boost.ResultOf support
|
||||
typedef bool result_type;
|
||||
|
||||
// Constructor
|
||||
pred_orF( Pred1T Pred1, Pred2T Pred2 ) :
|
||||
m_Pred1(Pred1), m_Pred2(Pred2) {}
|
||||
|
||||
// Operation
|
||||
template<typename CharT>
|
||||
bool operator()( CharT Ch ) const
|
||||
{
|
||||
return m_Pred1(Ch) || m_Pred2(Ch);
|
||||
}
|
||||
|
||||
private:
|
||||
Pred1T m_Pred1;
|
||||
Pred2T m_Pred2;
|
||||
};
|
||||
|
||||
// class_not composition predicate
|
||||
template< typename PredT >
|
||||
struct pred_notF :
|
||||
public predicate_facade< pred_notF<PredT> >
|
||||
{
|
||||
public:
|
||||
// Boost.ResultOf support
|
||||
typedef bool result_type;
|
||||
|
||||
// Constructor
|
||||
pred_notF( PredT Pred ) : m_Pred(Pred) {}
|
||||
|
||||
// Operation
|
||||
template<typename CharT>
|
||||
bool operator()( CharT Ch ) const
|
||||
{
|
||||
return !m_Pred(Ch);
|
||||
}
|
||||
|
||||
private:
|
||||
PredT m_Pred;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
} // namespace algorithm
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif // BOOST_STRING_CLASSIFICATION_DETAIL_HPP
|
|
@ -1,87 +0,0 @@
|
|||
// Boost string_algo library find_iterator.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2003.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
|
||||
#define BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
|
||||
|
||||
#include <boost/algorithm/string/config.hpp>
|
||||
#include <boost/range/iterator_range_core.hpp>
|
||||
#include <boost/iterator/iterator_facade.hpp>
|
||||
#include <boost/iterator/iterator_categories.hpp>
|
||||
#include <boost/function.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
namespace detail {
|
||||
|
||||
// find_iterator base -----------------------------------------------//
|
||||
|
||||
// Find iterator base
|
||||
template<typename IteratorT>
|
||||
class find_iterator_base
|
||||
{
|
||||
protected:
|
||||
// typedefs
|
||||
typedef IteratorT input_iterator_type;
|
||||
typedef iterator_range<IteratorT> match_type;
|
||||
typedef function2<
|
||||
match_type,
|
||||
input_iterator_type,
|
||||
input_iterator_type> finder_type;
|
||||
|
||||
protected:
|
||||
// Protected construction/destruction
|
||||
|
||||
// Default constructor
|
||||
find_iterator_base() {}
|
||||
// Copy construction
|
||||
find_iterator_base( const find_iterator_base& Other ) :
|
||||
m_Finder(Other.m_Finder) {}
|
||||
|
||||
// Constructor
|
||||
template<typename FinderT>
|
||||
find_iterator_base( FinderT Finder, int ) :
|
||||
m_Finder(Finder) {}
|
||||
|
||||
// Destructor
|
||||
~find_iterator_base() {}
|
||||
|
||||
// Find operation
|
||||
match_type do_find(
|
||||
input_iterator_type Begin,
|
||||
input_iterator_type End ) const
|
||||
{
|
||||
if (!m_Finder.empty())
|
||||
{
|
||||
return m_Finder(Begin,End);
|
||||
}
|
||||
else
|
||||
{
|
||||
return match_type(End,End);
|
||||
}
|
||||
}
|
||||
|
||||
// Check
|
||||
bool is_null() const
|
||||
{
|
||||
return m_Finder.empty();
|
||||
}
|
||||
|
||||
private:
|
||||
// Finder
|
||||
finder_type m_Finder;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
} // namespace algorithm
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif // BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
|
|
@ -1,95 +0,0 @@
|
|||
// Boost string_algo library trim.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2003.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_TRIM_DETAIL_HPP
|
||||
#define BOOST_STRING_TRIM_DETAIL_HPP
|
||||
|
||||
#include <boost/algorithm/string/config.hpp>
|
||||
#include <boost/detail/iterator.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
namespace detail {
|
||||
|
||||
// trim iterator helper -----------------------------------------------//
|
||||
|
||||
template< typename ForwardIteratorT, typename PredicateT >
|
||||
inline ForwardIteratorT trim_end_iter_select(
|
||||
ForwardIteratorT InBegin,
|
||||
ForwardIteratorT InEnd,
|
||||
PredicateT IsSpace,
|
||||
std::forward_iterator_tag )
|
||||
{
|
||||
ForwardIteratorT TrimIt=InBegin;
|
||||
|
||||
for( ForwardIteratorT It=InBegin; It!=InEnd; ++It )
|
||||
{
|
||||
if ( !IsSpace(*It) )
|
||||
{
|
||||
TrimIt=It;
|
||||
++TrimIt;
|
||||
}
|
||||
}
|
||||
|
||||
return TrimIt;
|
||||
}
|
||||
|
||||
template< typename ForwardIteratorT, typename PredicateT >
|
||||
inline ForwardIteratorT trim_end_iter_select(
|
||||
ForwardIteratorT InBegin,
|
||||
ForwardIteratorT InEnd,
|
||||
PredicateT IsSpace,
|
||||
std::bidirectional_iterator_tag )
|
||||
{
|
||||
for( ForwardIteratorT It=InEnd; It!=InBegin; )
|
||||
{
|
||||
if ( !IsSpace(*(--It)) )
|
||||
return ++It;
|
||||
}
|
||||
|
||||
return InBegin;
|
||||
}
|
||||
// Search for first non matching character from the beginning of the sequence
|
||||
template< typename ForwardIteratorT, typename PredicateT >
|
||||
inline ForwardIteratorT trim_begin(
|
||||
ForwardIteratorT InBegin,
|
||||
ForwardIteratorT InEnd,
|
||||
PredicateT IsSpace )
|
||||
{
|
||||
ForwardIteratorT It=InBegin;
|
||||
for(; It!=InEnd; ++It )
|
||||
{
|
||||
if (!IsSpace(*It))
|
||||
return It;
|
||||
}
|
||||
|
||||
return It;
|
||||
}
|
||||
|
||||
// Search for first non matching character from the end of the sequence
|
||||
template< typename ForwardIteratorT, typename PredicateT >
|
||||
inline ForwardIteratorT trim_end(
|
||||
ForwardIteratorT InBegin,
|
||||
ForwardIteratorT InEnd,
|
||||
PredicateT IsSpace )
|
||||
{
|
||||
typedef BOOST_STRING_TYPENAME boost::detail::
|
||||
iterator_traits<ForwardIteratorT>::iterator_category category;
|
||||
|
||||
return ::boost::algorithm::detail::trim_end_iter_select( InBegin, InEnd, IsSpace, category() );
|
||||
}
|
||||
|
||||
|
||||
} // namespace detail
|
||||
} // namespace algorithm
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif // BOOST_STRING_TRIM_DETAIL_HPP
|
|
@ -1,388 +0,0 @@
|
|||
// Boost string_algo library find_iterator.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2004.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_FIND_ITERATOR_HPP
|
||||
#define BOOST_STRING_FIND_ITERATOR_HPP
|
||||
|
||||
#include <boost/algorithm/string/config.hpp>
|
||||
#include <boost/iterator/iterator_facade.hpp>
|
||||
#include <boost/iterator/iterator_categories.hpp>
|
||||
|
||||
#include <boost/range/iterator_range_core.hpp>
|
||||
#include <boost/range/begin.hpp>
|
||||
#include <boost/range/end.hpp>
|
||||
#include <boost/range/iterator.hpp>
|
||||
#include <boost/range/as_literal.hpp>
|
||||
|
||||
#include <boost/algorithm/string/detail/find_iterator.hpp>
|
||||
|
||||
/*! \file
|
||||
Defines find iterator classes. Find iterator repeatedly applies a Finder
|
||||
to the specified input string to search for matches. Dereferencing
|
||||
the iterator yields the current match or a range between the last and the current
|
||||
match depending on the iterator used.
|
||||
*/
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
|
||||
// find_iterator -----------------------------------------------//
|
||||
|
||||
//! find_iterator
|
||||
/*!
|
||||
Find iterator encapsulates a Finder and allows
|
||||
for incremental searching in a string.
|
||||
Each increment moves the iterator to the next match.
|
||||
|
||||
Find iterator is a readable forward traversal iterator.
|
||||
|
||||
Dereferencing the iterator yields an iterator_range delimiting
|
||||
the current match.
|
||||
*/
|
||||
template<typename IteratorT>
|
||||
class find_iterator :
|
||||
public iterator_facade<
|
||||
find_iterator<IteratorT>,
|
||||
const iterator_range<IteratorT>,
|
||||
forward_traversal_tag >,
|
||||
private detail::find_iterator_base<IteratorT>
|
||||
{
|
||||
private:
|
||||
// facade support
|
||||
friend class ::boost::iterator_core_access;
|
||||
|
||||
private:
|
||||
// typedefs
|
||||
|
||||
typedef detail::find_iterator_base<IteratorT> base_type;
|
||||
typedef BOOST_STRING_TYPENAME
|
||||
base_type::input_iterator_type input_iterator_type;
|
||||
typedef BOOST_STRING_TYPENAME
|
||||
base_type::match_type match_type;
|
||||
|
||||
public:
|
||||
//! Default constructor
|
||||
/*!
|
||||
Construct null iterator. All null iterators are equal.
|
||||
|
||||
\post eof()==true
|
||||
*/
|
||||
find_iterator() {}
|
||||
|
||||
//! Copy constructor
|
||||
/*!
|
||||
Construct a copy of the find_iterator
|
||||
*/
|
||||
find_iterator( const find_iterator& Other ) :
|
||||
base_type(Other),
|
||||
m_Match(Other.m_Match),
|
||||
m_End(Other.m_End) {}
|
||||
|
||||
//! Constructor
|
||||
/*!
|
||||
Construct new find_iterator for a given finder
|
||||
and a range.
|
||||
*/
|
||||
template<typename FinderT>
|
||||
find_iterator(
|
||||
IteratorT Begin,
|
||||
IteratorT End,
|
||||
FinderT Finder ) :
|
||||
detail::find_iterator_base<IteratorT>(Finder,0),
|
||||
m_Match(Begin,Begin),
|
||||
m_End(End)
|
||||
{
|
||||
increment();
|
||||
}
|
||||
|
||||
//! Constructor
|
||||
/*!
|
||||
Construct new find_iterator for a given finder
|
||||
and a range.
|
||||
*/
|
||||
template<typename FinderT, typename RangeT>
|
||||
find_iterator(
|
||||
RangeT& Col,
|
||||
FinderT Finder ) :
|
||||
detail::find_iterator_base<IteratorT>(Finder,0)
|
||||
{
|
||||
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(::boost::as_literal(Col));
|
||||
m_Match=::boost::make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
|
||||
m_End=::boost::end(lit_col);
|
||||
|
||||
increment();
|
||||
}
|
||||
|
||||
private:
|
||||
// iterator operations
|
||||
|
||||
// dereference
|
||||
const match_type& dereference() const
|
||||
{
|
||||
return m_Match;
|
||||
}
|
||||
|
||||
// increment
|
||||
void increment()
|
||||
{
|
||||
m_Match=this->do_find(m_Match.end(),m_End);
|
||||
}
|
||||
|
||||
// comparison
|
||||
bool equal( const find_iterator& Other ) const
|
||||
{
|
||||
bool bEof=eof();
|
||||
bool bOtherEof=Other.eof();
|
||||
|
||||
return bEof || bOtherEof ? bEof==bOtherEof :
|
||||
(
|
||||
m_Match==Other.m_Match &&
|
||||
m_End==Other.m_End
|
||||
);
|
||||
}
|
||||
|
||||
public:
|
||||
// operations
|
||||
|
||||
//! Eof check
|
||||
/*!
|
||||
Check the eof condition. Eof condition means that
|
||||
there is nothing more to be searched i.e. find_iterator
|
||||
is after the last match.
|
||||
*/
|
||||
bool eof() const
|
||||
{
|
||||
return
|
||||
this->is_null() ||
|
||||
(
|
||||
m_Match.begin() == m_End &&
|
||||
m_Match.end() == m_End
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
// Attributes
|
||||
match_type m_Match;
|
||||
input_iterator_type m_End;
|
||||
};
|
||||
|
||||
//! find iterator construction helper
|
||||
/*!
|
||||
* Construct a find iterator to iterate through the specified string
|
||||
*/
|
||||
template<typename RangeT, typename FinderT>
|
||||
inline find_iterator<
|
||||
BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
|
||||
make_find_iterator(
|
||||
RangeT& Collection,
|
||||
FinderT Finder)
|
||||
{
|
||||
return find_iterator<BOOST_STRING_TYPENAME range_iterator<RangeT>::type>(
|
||||
Collection, Finder);
|
||||
}
|
||||
|
||||
// split iterator -----------------------------------------------//
|
||||
|
||||
//! split_iterator
|
||||
/*!
|
||||
Split iterator encapsulates a Finder and allows
|
||||
for incremental searching in a string.
|
||||
Unlike the find iterator, split iterator iterates
|
||||
through gaps between matches.
|
||||
|
||||
Find iterator is a readable forward traversal iterator.
|
||||
|
||||
Dereferencing the iterator yields an iterator_range delimiting
|
||||
the current match.
|
||||
*/
|
||||
template<typename IteratorT>
|
||||
class split_iterator :
|
||||
public iterator_facade<
|
||||
split_iterator<IteratorT>,
|
||||
const iterator_range<IteratorT>,
|
||||
forward_traversal_tag >,
|
||||
private detail::find_iterator_base<IteratorT>
|
||||
{
|
||||
private:
|
||||
// facade support
|
||||
friend class ::boost::iterator_core_access;
|
||||
|
||||
private:
|
||||
// typedefs
|
||||
|
||||
typedef detail::find_iterator_base<IteratorT> base_type;
|
||||
typedef BOOST_STRING_TYPENAME
|
||||
base_type::input_iterator_type input_iterator_type;
|
||||
typedef BOOST_STRING_TYPENAME
|
||||
base_type::match_type match_type;
|
||||
|
||||
public:
|
||||
//! Default constructor
|
||||
/*!
|
||||
Construct null iterator. All null iterators are equal.
|
||||
|
||||
\post eof()==true
|
||||
*/
|
||||
split_iterator() :
|
||||
m_Next(),
|
||||
m_End(),
|
||||
m_bEof(true)
|
||||
{}
|
||||
|
||||
//! Copy constructor
|
||||
/*!
|
||||
Construct a copy of the split_iterator
|
||||
*/
|
||||
split_iterator( const split_iterator& Other ) :
|
||||
base_type(Other),
|
||||
m_Match(Other.m_Match),
|
||||
m_Next(Other.m_Next),
|
||||
m_End(Other.m_End),
|
||||
m_bEof(Other.m_bEof)
|
||||
{}
|
||||
|
||||
//! Constructor
|
||||
/*!
|
||||
Construct new split_iterator for a given finder
|
||||
and a range.
|
||||
*/
|
||||
template<typename FinderT>
|
||||
split_iterator(
|
||||
IteratorT Begin,
|
||||
IteratorT End,
|
||||
FinderT Finder ) :
|
||||
detail::find_iterator_base<IteratorT>(Finder,0),
|
||||
m_Match(Begin,Begin),
|
||||
m_Next(Begin),
|
||||
m_End(End),
|
||||
m_bEof(false)
|
||||
{
|
||||
// force the correct behavior for empty sequences and yield at least one token
|
||||
if(Begin!=End)
|
||||
{
|
||||
increment();
|
||||
}
|
||||
}
|
||||
//! Constructor
|
||||
/*!
|
||||
Construct new split_iterator for a given finder
|
||||
and a collection.
|
||||
*/
|
||||
template<typename FinderT, typename RangeT>
|
||||
split_iterator(
|
||||
RangeT& Col,
|
||||
FinderT Finder ) :
|
||||
detail::find_iterator_base<IteratorT>(Finder,0),
|
||||
m_bEof(false)
|
||||
{
|
||||
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(::boost::as_literal(Col));
|
||||
m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
|
||||
m_Next=::boost::begin(lit_col);
|
||||
m_End=::boost::end(lit_col);
|
||||
|
||||
// force the correct behavior for empty sequences and yield at least one token
|
||||
if(m_Next!=m_End)
|
||||
{
|
||||
increment();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
// iterator operations
|
||||
|
||||
// dereference
|
||||
const match_type& dereference() const
|
||||
{
|
||||
return m_Match;
|
||||
}
|
||||
|
||||
// increment
|
||||
void increment()
|
||||
{
|
||||
match_type FindMatch=this->do_find( m_Next, m_End );
|
||||
|
||||
if(FindMatch.begin()==m_End && FindMatch.end()==m_End)
|
||||
{
|
||||
if(m_Match.end()==m_End)
|
||||
{
|
||||
// Mark iterator as eof
|
||||
m_bEof=true;
|
||||
}
|
||||
}
|
||||
|
||||
m_Match=match_type( m_Next, FindMatch.begin() );
|
||||
m_Next=FindMatch.end();
|
||||
}
|
||||
|
||||
// comparison
|
||||
bool equal( const split_iterator& Other ) const
|
||||
{
|
||||
bool bEof=eof();
|
||||
bool bOtherEof=Other.eof();
|
||||
|
||||
return bEof || bOtherEof ? bEof==bOtherEof :
|
||||
(
|
||||
m_Match==Other.m_Match &&
|
||||
m_Next==Other.m_Next &&
|
||||
m_End==Other.m_End
|
||||
);
|
||||
}
|
||||
|
||||
public:
|
||||
// operations
|
||||
|
||||
//! Eof check
|
||||
/*!
|
||||
Check the eof condition. Eof condition means that
|
||||
there is nothing more to be searched i.e. find_iterator
|
||||
is after the last match.
|
||||
*/
|
||||
bool eof() const
|
||||
{
|
||||
return this->is_null() || m_bEof;
|
||||
}
|
||||
|
||||
private:
|
||||
// Attributes
|
||||
match_type m_Match;
|
||||
input_iterator_type m_Next;
|
||||
input_iterator_type m_End;
|
||||
bool m_bEof;
|
||||
};
|
||||
|
||||
//! split iterator construction helper
|
||||
/*!
|
||||
* Construct a split iterator to iterate through the specified collection
|
||||
*/
|
||||
template<typename RangeT, typename FinderT>
|
||||
inline split_iterator<
|
||||
BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
|
||||
make_split_iterator(
|
||||
RangeT& Collection,
|
||||
FinderT Finder)
|
||||
{
|
||||
return split_iterator<BOOST_STRING_TYPENAME range_iterator<RangeT>::type>(
|
||||
Collection, Finder);
|
||||
}
|
||||
|
||||
|
||||
} // namespace algorithm
|
||||
|
||||
// pull names to the boost namespace
|
||||
using algorithm::find_iterator;
|
||||
using algorithm::make_find_iterator;
|
||||
using algorithm::split_iterator;
|
||||
using algorithm::make_split_iterator;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif // BOOST_STRING_FIND_ITERATOR_HPP
|
|
@ -1,201 +0,0 @@
|
|||
// Boost string_algo library iter_find.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2003.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_ITER_FIND_HPP
|
||||
#define BOOST_STRING_ITER_FIND_HPP
|
||||
|
||||
#include <boost/algorithm/string/config.hpp>
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <boost/iterator/transform_iterator.hpp>
|
||||
|
||||
#include <boost/range/iterator_range_core.hpp>
|
||||
#include <boost/range/begin.hpp>
|
||||
#include <boost/range/end.hpp>
|
||||
#include <boost/range/iterator.hpp>
|
||||
#include <boost/range/value_type.hpp>
|
||||
#include <boost/range/as_literal.hpp>
|
||||
|
||||
#include <boost/algorithm/string/concept.hpp>
|
||||
#include <boost/algorithm/string/find_iterator.hpp>
|
||||
#include <boost/algorithm/string/detail/util.hpp>
|
||||
|
||||
/*! \file
|
||||
Defines generic split algorithms. Split algorithms can be
|
||||
used to divide a sequence into several part according
|
||||
to a given criteria. Result is given as a 'container
|
||||
of containers' where elements are copies or references
|
||||
to extracted parts.
|
||||
|
||||
There are two algorithms provided. One iterates over matching
|
||||
substrings, the other one over the gaps between these matches.
|
||||
*/
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
|
||||
// iterate find ---------------------------------------------------//
|
||||
|
||||
//! Iter find algorithm
|
||||
/*!
|
||||
This algorithm executes a given finder in iteration on the input,
|
||||
until the end of input is reached, or no match is found.
|
||||
Iteration is done using built-in find_iterator, so the real
|
||||
searching is performed only when needed.
|
||||
In each iteration new match is found and added to the result.
|
||||
|
||||
\param Result A 'container container' to contain the result of search.
|
||||
Both outer and inner container must have constructor taking a pair
|
||||
of iterators as an argument.
|
||||
Typical type of the result is
|
||||
\c std::vector<boost::iterator_range<iterator>>
|
||||
(each element of such a vector will container a range delimiting
|
||||
a match).
|
||||
\param Input A container which will be searched.
|
||||
\param Finder A Finder object used for searching
|
||||
\return A reference to the result
|
||||
|
||||
\note Prior content of the result will be overwritten.
|
||||
*/
|
||||
template<
|
||||
typename SequenceSequenceT,
|
||||
typename RangeT,
|
||||
typename FinderT >
|
||||
inline SequenceSequenceT&
|
||||
iter_find(
|
||||
SequenceSequenceT& Result,
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
RangeT&& Input,
|
||||
#else
|
||||
RangeT& Input,
|
||||
#endif
|
||||
FinderT Finder )
|
||||
{
|
||||
BOOST_CONCEPT_ASSERT((
|
||||
FinderConcept<
|
||||
FinderT,
|
||||
BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
|
||||
));
|
||||
|
||||
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
|
||||
|
||||
typedef BOOST_STRING_TYPENAME
|
||||
range_iterator<RangeT>::type input_iterator_type;
|
||||
typedef find_iterator<input_iterator_type> find_iterator_type;
|
||||
typedef detail::copy_iterator_rangeF<
|
||||
BOOST_STRING_TYPENAME
|
||||
range_value<SequenceSequenceT>::type,
|
||||
input_iterator_type> copy_range_type;
|
||||
|
||||
input_iterator_type InputEnd=::boost::end(lit_input);
|
||||
|
||||
typedef transform_iterator<copy_range_type, find_iterator_type>
|
||||
transform_iter_type;
|
||||
|
||||
transform_iter_type itBegin=
|
||||
::boost::make_transform_iterator(
|
||||
find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ),
|
||||
copy_range_type());
|
||||
|
||||
transform_iter_type itEnd=
|
||||
::boost::make_transform_iterator(
|
||||
find_iterator_type(),
|
||||
copy_range_type());
|
||||
|
||||
SequenceSequenceT Tmp(itBegin, itEnd);
|
||||
|
||||
Result.swap(Tmp);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// iterate split ---------------------------------------------------//
|
||||
|
||||
//! Split find algorithm
|
||||
/*!
|
||||
This algorithm executes a given finder in iteration on the input,
|
||||
until the end of input is reached, or no match is found.
|
||||
Iteration is done using built-in find_iterator, so the real
|
||||
searching is performed only when needed.
|
||||
Each match is used as a separator of segments. These segments are then
|
||||
returned in the result.
|
||||
|
||||
\param Result A 'container container' to contain the result of search.
|
||||
Both outer and inner container must have constructor taking a pair
|
||||
of iterators as an argument.
|
||||
Typical type of the result is
|
||||
\c std::vector<boost::iterator_range<iterator>>
|
||||
(each element of such a vector will container a range delimiting
|
||||
a match).
|
||||
\param Input A container which will be searched.
|
||||
\param Finder A finder object used for searching
|
||||
\return A reference to the result
|
||||
|
||||
\note Prior content of the result will be overwritten.
|
||||
*/
|
||||
template<
|
||||
typename SequenceSequenceT,
|
||||
typename RangeT,
|
||||
typename FinderT >
|
||||
inline SequenceSequenceT&
|
||||
iter_split(
|
||||
SequenceSequenceT& Result,
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
RangeT&& Input,
|
||||
#else
|
||||
RangeT& Input,
|
||||
#endif
|
||||
FinderT Finder )
|
||||
{
|
||||
BOOST_CONCEPT_ASSERT((
|
||||
FinderConcept<FinderT,
|
||||
BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
|
||||
));
|
||||
|
||||
iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
|
||||
|
||||
typedef BOOST_STRING_TYPENAME
|
||||
range_iterator<RangeT>::type input_iterator_type;
|
||||
typedef split_iterator<input_iterator_type> find_iterator_type;
|
||||
typedef detail::copy_iterator_rangeF<
|
||||
BOOST_STRING_TYPENAME
|
||||
range_value<SequenceSequenceT>::type,
|
||||
input_iterator_type> copy_range_type;
|
||||
|
||||
input_iterator_type InputEnd=::boost::end(lit_input);
|
||||
|
||||
typedef transform_iterator<copy_range_type, find_iterator_type>
|
||||
transform_iter_type;
|
||||
|
||||
transform_iter_type itBegin=
|
||||
::boost::make_transform_iterator(
|
||||
find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ),
|
||||
copy_range_type() );
|
||||
|
||||
transform_iter_type itEnd=
|
||||
::boost::make_transform_iterator(
|
||||
find_iterator_type(),
|
||||
copy_range_type() );
|
||||
|
||||
SequenceSequenceT Tmp(itBegin, itEnd);
|
||||
|
||||
Result.swap(Tmp);
|
||||
return Result;
|
||||
}
|
||||
|
||||
} // namespace algorithm
|
||||
|
||||
// pull names to the boost namespace
|
||||
using algorithm::iter_find;
|
||||
using algorithm::iter_split;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif // BOOST_STRING_ITER_FIND_HPP
|
|
@ -1,42 +0,0 @@
|
|||
// Boost string_algo library predicate_facade.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2003.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_PREDICATE_FACADE_HPP
|
||||
#define BOOST_STRING_PREDICATE_FACADE_HPP
|
||||
|
||||
#include <boost/algorithm/string/config.hpp>
|
||||
|
||||
/*
|
||||
\file boost/algorith/string/predicate_facade.hpp
|
||||
This file contains predicate_facade definition. This template class is used
|
||||
to identify classification predicates, so they can be combined using
|
||||
composition operators.
|
||||
*/
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
|
||||
// predicate facade ------------------------------------------------------//
|
||||
|
||||
//! Predicate facade
|
||||
/*!
|
||||
This class allows to recognize classification
|
||||
predicates, so that they can be combined using
|
||||
composition operators.
|
||||
Every classification predicate must be derived from this class.
|
||||
*/
|
||||
template<typename Derived>
|
||||
struct predicate_facade {};
|
||||
|
||||
} // namespace algorithm
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif // BOOST_STRING_CLASSIFICATION_DETAIL_HPP
|
|
@ -1,175 +0,0 @@
|
|||
// Boost string_algo library split.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2006.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_SPLIT_HPP
|
||||
#define BOOST_STRING_SPLIT_HPP
|
||||
|
||||
#include <boost/algorithm/string/config.hpp>
|
||||
|
||||
#include <boost/algorithm/string/iter_find.hpp>
|
||||
#include <boost/algorithm/string/finder.hpp>
|
||||
#include <boost/algorithm/string/compare.hpp>
|
||||
|
||||
/*! \file
|
||||
Defines basic split algorithms.
|
||||
Split algorithms can be used to divide a string
|
||||
into several parts according to given criteria.
|
||||
|
||||
Each part is copied and added as a new element to the
|
||||
output container.
|
||||
Thus the result container must be able to hold copies
|
||||
of the matches (in a compatible structure like std::string) or
|
||||
a reference to it (e.g. using the iterator range class).
|
||||
Examples of such a container are \c std::vector<std::string>
|
||||
or \c std::list<boost::iterator_range<std::string::iterator>>
|
||||
*/
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
|
||||
// find_all ------------------------------------------------------------//
|
||||
|
||||
//! Find all algorithm
|
||||
/*!
|
||||
This algorithm finds all occurrences of the search string
|
||||
in the input.
|
||||
|
||||
Each part is copied and added as a new element to the
|
||||
output container.
|
||||
Thus the result container must be able to hold copies
|
||||
of the matches (in a compatible structure like std::string) or
|
||||
a reference to it (e.g. using the iterator range class).
|
||||
Examples of such a container are \c std::vector<std::string>
|
||||
or \c std::list<boost::iterator_range<std::string::iterator>>
|
||||
|
||||
\param Result A container that can hold copies of references to the substrings
|
||||
\param Input A container which will be searched.
|
||||
\param Search A substring to be searched for.
|
||||
\return A reference the result
|
||||
|
||||
\note Prior content of the result will be overwritten.
|
||||
|
||||
\note This function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template< typename SequenceSequenceT, typename Range1T, typename Range2T >
|
||||
inline SequenceSequenceT& find_all(
|
||||
SequenceSequenceT& Result,
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
Range1T&& Input,
|
||||
#else
|
||||
Range1T& Input,
|
||||
#endif
|
||||
const Range2T& Search)
|
||||
{
|
||||
return ::boost::algorithm::iter_find(
|
||||
Result,
|
||||
Input,
|
||||
::boost::algorithm::first_finder(Search) );
|
||||
}
|
||||
|
||||
//! Find all algorithm ( case insensitive )
|
||||
/*!
|
||||
This algorithm finds all occurrences of the search string
|
||||
in the input.
|
||||
Each part is copied and added as a new element to the
|
||||
output container. Thus the result container must be able to hold copies
|
||||
of the matches (in a compatible structure like std::string) or
|
||||
a reference to it (e.g. using the iterator range class).
|
||||
Examples of such a container are \c std::vector<std::string>
|
||||
or \c std::list<boost::iterator_range<std::string::iterator>>
|
||||
|
||||
Searching is case insensitive.
|
||||
|
||||
\param Result A container that can hold copies of references to the substrings
|
||||
\param Input A container which will be searched.
|
||||
\param Search A substring to be searched for.
|
||||
\param Loc A locale used for case insensitive comparison
|
||||
\return A reference the result
|
||||
|
||||
\note Prior content of the result will be overwritten.
|
||||
|
||||
\note This function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template< typename SequenceSequenceT, typename Range1T, typename Range2T >
|
||||
inline SequenceSequenceT& ifind_all(
|
||||
SequenceSequenceT& Result,
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
Range1T&& Input,
|
||||
#else
|
||||
Range1T& Input,
|
||||
#endif
|
||||
const Range2T& Search,
|
||||
const std::locale& Loc=std::locale() )
|
||||
{
|
||||
return ::boost::algorithm::iter_find(
|
||||
Result,
|
||||
Input,
|
||||
::boost::algorithm::first_finder(Search, is_iequal(Loc) ) );
|
||||
}
|
||||
|
||||
|
||||
// tokenize -------------------------------------------------------------//
|
||||
|
||||
//! Split algorithm
|
||||
/*!
|
||||
Tokenize expression. This function is equivalent to C strtok. Input
|
||||
sequence is split into tokens, separated by separators. Separators
|
||||
are given by means of the predicate.
|
||||
|
||||
Each part is copied and added as a new element to the
|
||||
output container.
|
||||
Thus the result container must be able to hold copies
|
||||
of the matches (in a compatible structure like std::string) or
|
||||
a reference to it (e.g. using the iterator range class).
|
||||
Examples of such a container are \c std::vector<std::string>
|
||||
or \c std::list<boost::iterator_range<std::string::iterator>>
|
||||
|
||||
\param Result A container that can hold copies of references to the substrings
|
||||
\param Input A container which will be searched.
|
||||
\param Pred A predicate to identify separators. This predicate is
|
||||
supposed to return true if a given element is a separator.
|
||||
\param eCompress If eCompress argument is set to token_compress_on, adjacent
|
||||
separators are merged together. Otherwise, every two separators
|
||||
delimit a token.
|
||||
\return A reference the result
|
||||
|
||||
\note Prior content of the result will be overwritten.
|
||||
|
||||
\note This function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template< typename SequenceSequenceT, typename RangeT, typename PredicateT >
|
||||
inline SequenceSequenceT& split(
|
||||
SequenceSequenceT& Result,
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
RangeT&& Input,
|
||||
#else
|
||||
RangeT& Input,
|
||||
#endif
|
||||
PredicateT Pred,
|
||||
token_compress_mode_type eCompress=token_compress_off )
|
||||
{
|
||||
return ::boost::algorithm::iter_split(
|
||||
Result,
|
||||
Input,
|
||||
::boost::algorithm::token_finder( Pred, eCompress ) );
|
||||
}
|
||||
|
||||
} // namespace algorithm
|
||||
|
||||
// pull names to the boost namespace
|
||||
using algorithm::find_all;
|
||||
using algorithm::ifind_all;
|
||||
using algorithm::split;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif // BOOST_STRING_SPLIT_HPP
|
||||
|
|
@ -1,398 +0,0 @@
|
|||
// Boost string_algo library trim.hpp header file ---------------------------//
|
||||
|
||||
// Copyright Pavol Droba 2002-2003.
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/ for updates, documentation, and revision history.
|
||||
|
||||
#ifndef BOOST_STRING_TRIM_HPP
|
||||
#define BOOST_STRING_TRIM_HPP
|
||||
|
||||
#include <boost/algorithm/string/config.hpp>
|
||||
|
||||
#include <boost/range/begin.hpp>
|
||||
#include <boost/range/end.hpp>
|
||||
#include <boost/range/const_iterator.hpp>
|
||||
#include <boost/range/as_literal.hpp>
|
||||
#include <boost/range/iterator_range_core.hpp>
|
||||
|
||||
#include <boost/algorithm/string/detail/trim.hpp>
|
||||
#include <boost/algorithm/string/classification.hpp>
|
||||
#include <locale>
|
||||
|
||||
/*! \file
|
||||
Defines trim algorithms.
|
||||
Trim algorithms are used to remove trailing and leading spaces from a
|
||||
sequence (string). Space is recognized using given locales.
|
||||
|
||||
Parametric (\c _if) variants use a predicate (functor) to select which characters
|
||||
are to be trimmed..
|
||||
Functions take a selection predicate as a parameter, which is used to determine
|
||||
whether a character is a space. Common predicates are provided in classification.hpp header.
|
||||
|
||||
*/
|
||||
|
||||
namespace boost {
|
||||
namespace algorithm {
|
||||
|
||||
// left trim -----------------------------------------------//
|
||||
|
||||
|
||||
//! Left trim - parametric
|
||||
/*!
|
||||
Remove all leading spaces from the input.
|
||||
The supplied predicate is used to determine which characters are considered spaces.
|
||||
The result is a trimmed copy of the input. It is returned as a sequence
|
||||
or copied to the output iterator
|
||||
|
||||
\param Output An output iterator to which the result will be copied
|
||||
\param Input An input range
|
||||
\param IsSpace A unary predicate identifying spaces
|
||||
\return
|
||||
An output iterator pointing just after the last inserted character or
|
||||
a copy of the input
|
||||
|
||||
\note The second variant of this function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template<typename OutputIteratorT, typename RangeT, typename PredicateT>
|
||||
inline OutputIteratorT trim_left_copy_if(
|
||||
OutputIteratorT Output,
|
||||
const RangeT& Input,
|
||||
PredicateT IsSpace)
|
||||
{
|
||||
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
|
||||
|
||||
std::copy(
|
||||
::boost::algorithm::detail::trim_begin(
|
||||
::boost::begin(lit_range),
|
||||
::boost::end(lit_range),
|
||||
IsSpace ),
|
||||
::boost::end(lit_range),
|
||||
Output);
|
||||
|
||||
return Output;
|
||||
}
|
||||
|
||||
//! Left trim - parametric
|
||||
/*!
|
||||
\overload
|
||||
*/
|
||||
template<typename SequenceT, typename PredicateT>
|
||||
inline SequenceT trim_left_copy_if(const SequenceT& Input, PredicateT IsSpace)
|
||||
{
|
||||
return SequenceT(
|
||||
::boost::algorithm::detail::trim_begin(
|
||||
::boost::begin(Input),
|
||||
::boost::end(Input),
|
||||
IsSpace ),
|
||||
::boost::end(Input));
|
||||
}
|
||||
|
||||
//! Left trim - parametric
|
||||
/*!
|
||||
Remove all leading spaces from the input.
|
||||
The result is a trimmed copy of the input.
|
||||
|
||||
\param Input An input sequence
|
||||
\param Loc a locale used for 'space' classification
|
||||
\return A trimmed copy of the input
|
||||
|
||||
\note This function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template<typename SequenceT>
|
||||
inline SequenceT trim_left_copy(const SequenceT& Input, const std::locale& Loc=std::locale())
|
||||
{
|
||||
return
|
||||
::boost::algorithm::trim_left_copy_if(
|
||||
Input,
|
||||
is_space(Loc));
|
||||
}
|
||||
|
||||
//! Left trim
|
||||
/*!
|
||||
Remove all leading spaces from the input. The supplied predicate is
|
||||
used to determine which characters are considered spaces.
|
||||
The input sequence is modified in-place.
|
||||
|
||||
\param Input An input sequence
|
||||
\param IsSpace A unary predicate identifying spaces
|
||||
*/
|
||||
template<typename SequenceT, typename PredicateT>
|
||||
inline void trim_left_if(SequenceT& Input, PredicateT IsSpace)
|
||||
{
|
||||
Input.erase(
|
||||
::boost::begin(Input),
|
||||
::boost::algorithm::detail::trim_begin(
|
||||
::boost::begin(Input),
|
||||
::boost::end(Input),
|
||||
IsSpace));
|
||||
}
|
||||
|
||||
//! Left trim
|
||||
/*!
|
||||
Remove all leading spaces from the input.
|
||||
The Input sequence is modified in-place.
|
||||
|
||||
\param Input An input sequence
|
||||
\param Loc A locale used for 'space' classification
|
||||
*/
|
||||
template<typename SequenceT>
|
||||
inline void trim_left(SequenceT& Input, const std::locale& Loc=std::locale())
|
||||
{
|
||||
::boost::algorithm::trim_left_if(
|
||||
Input,
|
||||
is_space(Loc));
|
||||
}
|
||||
|
||||
// right trim -----------------------------------------------//
|
||||
|
||||
//! Right trim - parametric
|
||||
/*!
|
||||
Remove all trailing spaces from the input.
|
||||
The supplied predicate is used to determine which characters are considered spaces.
|
||||
The result is a trimmed copy of the input. It is returned as a sequence
|
||||
or copied to the output iterator
|
||||
|
||||
\param Output An output iterator to which the result will be copied
|
||||
\param Input An input range
|
||||
\param IsSpace A unary predicate identifying spaces
|
||||
\return
|
||||
An output iterator pointing just after the last inserted character or
|
||||
a copy of the input
|
||||
|
||||
\note The second variant of this function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template<typename OutputIteratorT, typename RangeT, typename PredicateT>
|
||||
inline OutputIteratorT trim_right_copy_if(
|
||||
OutputIteratorT Output,
|
||||
const RangeT& Input,
|
||||
PredicateT IsSpace )
|
||||
{
|
||||
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
|
||||
|
||||
std::copy(
|
||||
::boost::begin(lit_range),
|
||||
::boost::algorithm::detail::trim_end(
|
||||
::boost::begin(lit_range),
|
||||
::boost::end(lit_range),
|
||||
IsSpace ),
|
||||
Output );
|
||||
|
||||
return Output;
|
||||
}
|
||||
|
||||
//! Right trim - parametric
|
||||
/*!
|
||||
\overload
|
||||
*/
|
||||
template<typename SequenceT, typename PredicateT>
|
||||
inline SequenceT trim_right_copy_if(const SequenceT& Input, PredicateT IsSpace)
|
||||
{
|
||||
return SequenceT(
|
||||
::boost::begin(Input),
|
||||
::boost::algorithm::detail::trim_end(
|
||||
::boost::begin(Input),
|
||||
::boost::end(Input),
|
||||
IsSpace)
|
||||
);
|
||||
}
|
||||
|
||||
//! Right trim
|
||||
/*!
|
||||
Remove all trailing spaces from the input.
|
||||
The result is a trimmed copy of the input
|
||||
|
||||
\param Input An input sequence
|
||||
\param Loc A locale used for 'space' classification
|
||||
\return A trimmed copy of the input
|
||||
|
||||
\note This function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template<typename SequenceT>
|
||||
inline SequenceT trim_right_copy(const SequenceT& Input, const std::locale& Loc=std::locale())
|
||||
{
|
||||
return
|
||||
::boost::algorithm::trim_right_copy_if(
|
||||
Input,
|
||||
is_space(Loc));
|
||||
}
|
||||
|
||||
|
||||
//! Right trim - parametric
|
||||
/*!
|
||||
Remove all trailing spaces from the input.
|
||||
The supplied predicate is used to determine which characters are considered spaces.
|
||||
The input sequence is modified in-place.
|
||||
|
||||
\param Input An input sequence
|
||||
\param IsSpace A unary predicate identifying spaces
|
||||
*/
|
||||
template<typename SequenceT, typename PredicateT>
|
||||
inline void trim_right_if(SequenceT& Input, PredicateT IsSpace)
|
||||
{
|
||||
Input.erase(
|
||||
::boost::algorithm::detail::trim_end(
|
||||
::boost::begin(Input),
|
||||
::boost::end(Input),
|
||||
IsSpace ),
|
||||
::boost::end(Input)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
//! Right trim
|
||||
/*!
|
||||
Remove all trailing spaces from the input.
|
||||
The input sequence is modified in-place.
|
||||
|
||||
\param Input An input sequence
|
||||
\param Loc A locale used for 'space' classification
|
||||
*/
|
||||
template<typename SequenceT>
|
||||
inline void trim_right(SequenceT& Input, const std::locale& Loc=std::locale())
|
||||
{
|
||||
::boost::algorithm::trim_right_if(
|
||||
Input,
|
||||
is_space(Loc) );
|
||||
}
|
||||
|
||||
// both side trim -----------------------------------------------//
|
||||
|
||||
//! Trim - parametric
|
||||
/*!
|
||||
Remove all trailing and leading spaces from the input.
|
||||
The supplied predicate is used to determine which characters are considered spaces.
|
||||
The result is a trimmed copy of the input. It is returned as a sequence
|
||||
or copied to the output iterator
|
||||
|
||||
\param Output An output iterator to which the result will be copied
|
||||
\param Input An input range
|
||||
\param IsSpace A unary predicate identifying spaces
|
||||
\return
|
||||
An output iterator pointing just after the last inserted character or
|
||||
a copy of the input
|
||||
|
||||
\note The second variant of this function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template<typename OutputIteratorT, typename RangeT, typename PredicateT>
|
||||
inline OutputIteratorT trim_copy_if(
|
||||
OutputIteratorT Output,
|
||||
const RangeT& Input,
|
||||
PredicateT IsSpace)
|
||||
{
|
||||
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
|
||||
|
||||
BOOST_STRING_TYPENAME
|
||||
range_const_iterator<RangeT>::type TrimEnd=
|
||||
::boost::algorithm::detail::trim_end(
|
||||
::boost::begin(lit_range),
|
||||
::boost::end(lit_range),
|
||||
IsSpace);
|
||||
|
||||
std::copy(
|
||||
detail::trim_begin(
|
||||
::boost::begin(lit_range), TrimEnd, IsSpace),
|
||||
TrimEnd,
|
||||
Output
|
||||
);
|
||||
|
||||
return Output;
|
||||
}
|
||||
|
||||
//! Trim - parametric
|
||||
/*!
|
||||
\overload
|
||||
*/
|
||||
template<typename SequenceT, typename PredicateT>
|
||||
inline SequenceT trim_copy_if(const SequenceT& Input, PredicateT IsSpace)
|
||||
{
|
||||
BOOST_STRING_TYPENAME
|
||||
range_const_iterator<SequenceT>::type TrimEnd=
|
||||
::boost::algorithm::detail::trim_end(
|
||||
::boost::begin(Input),
|
||||
::boost::end(Input),
|
||||
IsSpace);
|
||||
|
||||
return SequenceT(
|
||||
detail::trim_begin(
|
||||
::boost::begin(Input),
|
||||
TrimEnd,
|
||||
IsSpace),
|
||||
TrimEnd
|
||||
);
|
||||
}
|
||||
|
||||
//! Trim
|
||||
/*!
|
||||
Remove all leading and trailing spaces from the input.
|
||||
The result is a trimmed copy of the input
|
||||
|
||||
\param Input An input sequence
|
||||
\param Loc A locale used for 'space' classification
|
||||
\return A trimmed copy of the input
|
||||
|
||||
\note This function provides the strong exception-safety guarantee
|
||||
*/
|
||||
template<typename SequenceT>
|
||||
inline SequenceT trim_copy( const SequenceT& Input, const std::locale& Loc=std::locale() )
|
||||
{
|
||||
return
|
||||
::boost::algorithm::trim_copy_if(
|
||||
Input,
|
||||
is_space(Loc) );
|
||||
}
|
||||
|
||||
//! Trim
|
||||
/*!
|
||||
Remove all leading and trailing spaces from the input.
|
||||
The supplied predicate is used to determine which characters are considered spaces.
|
||||
The input sequence is modified in-place.
|
||||
|
||||
\param Input An input sequence
|
||||
\param IsSpace A unary predicate identifying spaces
|
||||
*/
|
||||
template<typename SequenceT, typename PredicateT>
|
||||
inline void trim_if(SequenceT& Input, PredicateT IsSpace)
|
||||
{
|
||||
::boost::algorithm::trim_right_if( Input, IsSpace );
|
||||
::boost::algorithm::trim_left_if( Input, IsSpace );
|
||||
}
|
||||
|
||||
//! Trim
|
||||
/*!
|
||||
Remove all leading and trailing spaces from the input.
|
||||
The input sequence is modified in-place.
|
||||
|
||||
\param Input An input sequence
|
||||
\param Loc A locale used for 'space' classification
|
||||
*/
|
||||
template<typename SequenceT>
|
||||
inline void trim(SequenceT& Input, const std::locale& Loc=std::locale())
|
||||
{
|
||||
::boost::algorithm::trim_if(
|
||||
Input,
|
||||
is_space( Loc ) );
|
||||
}
|
||||
|
||||
} // namespace algorithm
|
||||
|
||||
// pull names to the boost namespace
|
||||
using algorithm::trim_left;
|
||||
using algorithm::trim_left_if;
|
||||
using algorithm::trim_left_copy;
|
||||
using algorithm::trim_left_copy_if;
|
||||
using algorithm::trim_right;
|
||||
using algorithm::trim_right_if;
|
||||
using algorithm::trim_right_copy;
|
||||
using algorithm::trim_right_copy_if;
|
||||
using algorithm::trim;
|
||||
using algorithm::trim_if;
|
||||
using algorithm::trim_copy;
|
||||
using algorithm::trim_copy_if;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_STRING_TRIM_HPP
|
|
@ -24,66 +24,6 @@
|
|||
namespace boost {
|
||||
namespace asio {
|
||||
|
||||
#if defined(BOOST_ASIO_HAS_CONCEPTS) \
|
||||
&& defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES) \
|
||||
&& defined(BOOST_ASIO_HAS_DECLTYPE)
|
||||
|
||||
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 T, typename... Args>
|
||||
BOOST_ASIO_CONCEPT callable_with = requires(T t, Args&&... args)
|
||||
{
|
||||
t(static_cast<Args&&>(args)...);
|
||||
};
|
||||
|
||||
template <typename T, typename Signature>
|
||||
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<T, Args...>)>
|
||||
{
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename T>
|
||||
BOOST_ASIO_CONCEPT completion_signature =
|
||||
detail::is_completion_signature<T>::value;
|
||||
|
||||
#define BOOST_ASIO_COMPLETION_SIGNATURE \
|
||||
::boost::asio::completion_signature
|
||||
|
||||
template <typename T, completion_signature Signature>
|
||||
BOOST_ASIO_CONCEPT completion_handler_for =
|
||||
detail::is_completion_handler_for<T, Signature>::value;
|
||||
|
||||
#define BOOST_ASIO_COMPLETION_HANDLER_FOR(s) \
|
||||
::boost::asio::completion_handler_for<s>
|
||||
|
||||
#else // defined(BOOST_ASIO_HAS_CONCEPTS)
|
||||
// && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
// && defined(BOOST_ASIO_HAS_DECLTYPE)
|
||||
|
||||
#define BOOST_ASIO_COMPLETION_SIGNATURE typename
|
||||
#define BOOST_ASIO_COMPLETION_HANDLER_FOR(s) typename
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_CONCEPTS)
|
||||
// && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
// && defined(BOOST_ASIO_HAS_DECLTYPE)
|
||||
|
||||
/// An interface for customising the behaviour of an initiating function.
|
||||
/**
|
||||
* The async_result traits class is used for determining:
|
||||
|
@ -102,7 +42,7 @@ BOOST_ASIO_CONCEPT completion_handler_for =
|
|||
* The primary template assumes that the CompletionToken is the completion
|
||||
* handler.
|
||||
*/
|
||||
template <typename CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURE Signature>
|
||||
template <typename CompletionToken, typename Signature>
|
||||
class async_result
|
||||
{
|
||||
public:
|
||||
|
@ -128,21 +68,12 @@ public:
|
|||
{
|
||||
}
|
||||
|
||||
#if defined(GENERATING_DOCUMENTATION)
|
||||
#if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES) \
|
||||
|| defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
/// 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(
|
||||
BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
||||
BOOST_ASIO_MOVE_ARG(RawCompletionToken) token,
|
||||
BOOST_ASIO_MOVE_ARG(Args)... args);
|
||||
|
||||
#elif defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
template <typename Initiation,
|
||||
BOOST_ASIO_COMPLETION_HANDLER_FOR(Signature) RawCompletionToken,
|
||||
typename... Args>
|
||||
static return_type initiate(
|
||||
BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
||||
BOOST_ASIO_MOVE_ARG(RawCompletionToken) token,
|
||||
|
@ -154,9 +85,9 @@ public:
|
|||
}
|
||||
|
||||
#else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
// || defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename Initiation,
|
||||
BOOST_ASIO_COMPLETION_HANDLER_FOR(Signature) RawCompletionToken>
|
||||
template <typename Initiation, typename RawCompletionToken>
|
||||
static return_type initiate(
|
||||
BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
||||
BOOST_ASIO_MOVE_ARG(RawCompletionToken) token)
|
||||
|
@ -166,8 +97,7 @@ public:
|
|||
}
|
||||
|
||||
#define BOOST_ASIO_PRIVATE_INITIATE_DEF(n) \
|
||||
template <typename Initiation, \
|
||||
BOOST_ASIO_COMPLETION_HANDLER_FOR(Signature) RawCompletionToken, \
|
||||
template <typename Initiation, typename RawCompletionToken, \
|
||||
BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
static return_type initiate( \
|
||||
BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
|
||||
|
@ -183,26 +113,17 @@ public:
|
|||
#undef BOOST_ASIO_PRIVATE_INITIATE_DEF
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
// || defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
private:
|
||||
async_result(const async_result&) BOOST_ASIO_DELETED;
|
||||
async_result& operator=(const async_result&) BOOST_ASIO_DELETED;
|
||||
};
|
||||
|
||||
#if !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <BOOST_ASIO_COMPLETION_SIGNATURE Signature>
|
||||
class async_result<void, Signature>
|
||||
{
|
||||
// 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, BOOST_ASIO_COMPLETION_SIGNATURE Signature>
|
||||
template <typename CompletionToken, typename Signature>
|
||||
struct async_completion
|
||||
{
|
||||
/// The real handler type to be used for the asynchronous operation.
|
||||
|
@ -312,50 +233,22 @@ struct async_result_has_initiate_memfn
|
|||
typename ::boost::asio::decay<ct>::type, sig>::completion_handler_type
|
||||
#endif
|
||||
|
||||
#if defined(GENERATION_DOCUMENTATION)
|
||||
# define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
|
||||
auto
|
||||
#elif defined(BOOST_ASIO_HAS_RETURN_TYPE_DEDUCTION)
|
||||
# define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
|
||||
auto
|
||||
#else
|
||||
# define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ct, sig)
|
||||
#endif
|
||||
|
||||
#if defined(GENERATION_DOCUMENTATION)
|
||||
# define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(ct, sig, expr) \
|
||||
void_or_deduced
|
||||
#elif defined(BOOST_ASIO_HAS_DECLTYPE)
|
||||
# define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(ct, sig, expr) \
|
||||
decltype expr
|
||||
#else
|
||||
# define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(ct, sig, expr) \
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ct, sig)
|
||||
#endif
|
||||
|
||||
#if defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename CompletionToken,
|
||||
completion_signature Signature,
|
||||
template <typename CompletionToken, typename Signature,
|
||||
typename Initiation, typename... Args>
|
||||
void_or_deduced async_initiate(
|
||||
BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)
|
||||
async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken),
|
||||
BOOST_ASIO_MOVE_ARG(Args)... args);
|
||||
|
||||
#elif defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
template <typename CompletionToken,
|
||||
BOOST_ASIO_COMPLETION_SIGNATURE Signature,
|
||||
template <typename CompletionToken, typename Signature,
|
||||
typename Initiation, typename... Args>
|
||||
inline typename enable_if<
|
||||
detail::async_result_has_initiate_memfn<CompletionToken, Signature>::value,
|
||||
BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(CompletionToken, Signature,
|
||||
(async_result<typename decay<CompletionToken>::type,
|
||||
Signature>::initiate(declval<BOOST_ASIO_MOVE_ARG(Initiation)>(),
|
||||
declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>(),
|
||||
declval<BOOST_ASIO_MOVE_ARG(Args)>()...)))>::type
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)>::type
|
||||
async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token,
|
||||
BOOST_ASIO_MOVE_ARG(Args)... args)
|
||||
|
@ -366,8 +259,7 @@ async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
|||
BOOST_ASIO_MOVE_CAST(Args)(args)...);
|
||||
}
|
||||
|
||||
template <typename CompletionToken,
|
||||
BOOST_ASIO_COMPLETION_SIGNATURE Signature,
|
||||
template <typename CompletionToken, typename Signature,
|
||||
typename Initiation, typename... Args>
|
||||
inline typename enable_if<
|
||||
!detail::async_result_has_initiate_memfn<CompletionToken, Signature>::value,
|
||||
|
@ -388,15 +280,10 @@ async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
|||
|
||||
#else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
template <typename CompletionToken,
|
||||
BOOST_ASIO_COMPLETION_SIGNATURE Signature,
|
||||
typename Initiation>
|
||||
template <typename CompletionToken, typename Signature, typename Initiation>
|
||||
inline typename enable_if<
|
||||
detail::async_result_has_initiate_memfn<CompletionToken, Signature>::value,
|
||||
BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(CompletionToken, Signature,
|
||||
(async_result<typename decay<CompletionToken>::type,
|
||||
Signature>::initiate(declval<BOOST_ASIO_MOVE_ARG(Initiation)>(),
|
||||
declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>())))>::type
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)>::type
|
||||
async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token)
|
||||
{
|
||||
|
@ -405,9 +292,7 @@ async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
|||
BOOST_ASIO_MOVE_CAST(CompletionToken)(token));
|
||||
}
|
||||
|
||||
template <typename CompletionToken,
|
||||
BOOST_ASIO_COMPLETION_SIGNATURE Signature,
|
||||
typename Initiation>
|
||||
template <typename CompletionToken, typename Signature, typename Initiation>
|
||||
inline typename enable_if<
|
||||
!detail::async_result_has_initiate_memfn<CompletionToken, Signature>::value,
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)>::type
|
||||
|
@ -424,17 +309,12 @@ async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
|||
}
|
||||
|
||||
#define BOOST_ASIO_PRIVATE_INITIATE_DEF(n) \
|
||||
template <typename CompletionToken, \
|
||||
BOOST_ASIO_COMPLETION_SIGNATURE Signature, \
|
||||
template <typename CompletionToken, typename Signature, \
|
||||
typename Initiation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
inline typename enable_if< \
|
||||
detail::async_result_has_initiate_memfn< \
|
||||
CompletionToken, Signature>::value, \
|
||||
BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(CompletionToken, Signature, \
|
||||
(async_result<typename decay<CompletionToken>::type, \
|
||||
Signature>::initiate(declval<BOOST_ASIO_MOVE_ARG(Initiation)>(), \
|
||||
declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>(), \
|
||||
BOOST_ASIO_VARIADIC_MOVE_DECLVAL(n))))>::type \
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)>::type \
|
||||
async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
|
||||
BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
|
||||
|
@ -445,8 +325,7 @@ async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
|||
BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
|
||||
} \
|
||||
\
|
||||
template <typename CompletionToken, \
|
||||
BOOST_ASIO_COMPLETION_SIGNATURE Signature, \
|
||||
template <typename CompletionToken, typename Signature, \
|
||||
typename Initiation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
inline typename enable_if< \
|
||||
!detail::async_result_has_initiate_memfn< \
|
||||
|
@ -471,114 +350,6 @@ async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
|
|||
|
||||
#endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
#if defined(BOOST_ASIO_HAS_CONCEPTS) \
|
||||
&& defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES) \
|
||||
&& defined(BOOST_ASIO_HAS_DECLTYPE)
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename Signature>
|
||||
struct initiation_archetype
|
||||
{
|
||||
template <completion_handler_for<Signature> CompletionHandler>
|
||||
void operator()(CompletionHandler&&) const
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename T, completion_signature Signature>
|
||||
BOOST_ASIO_CONCEPT completion_token_for = requires(T&& t)
|
||||
{
|
||||
async_initiate<T, Signature>(detail::initiation_archetype<Signature>{}, t);
|
||||
};
|
||||
|
||||
#define BOOST_ASIO_COMPLETION_TOKEN_FOR(s) \
|
||||
::boost::asio::completion_token_for<s>
|
||||
|
||||
#else // defined(BOOST_ASIO_HAS_CONCEPTS)
|
||||
// && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
// && defined(BOOST_ASIO_HAS_DECLTYPE)
|
||||
|
||||
#define BOOST_ASIO_COMPLETION_TOKEN_FOR(s) typename
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_CONCEPTS)
|
||||
// && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
// && defined(BOOST_ASIO_HAS_DECLTYPE)
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename>
|
||||
struct default_completion_token_check
|
||||
{
|
||||
typedef void type;
|
||||
};
|
||||
|
||||
template <typename T, typename = void>
|
||||
struct default_completion_token_impl
|
||||
{
|
||||
typedef void type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct default_completion_token_impl<T,
|
||||
typename default_completion_token_check<
|
||||
typename T::default_completion_token_type>::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
|
||||
|
||||
#if defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES)
|
||||
|
||||
template <typename T>
|
||||
using default_completion_token_t = typename default_completion_token<T>::type;
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES)
|
||||
|
||||
#if defined(BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
|
||||
|
||||
#define BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(e) \
|
||||
= typename ::boost::asio::default_completion_token<e>::type
|
||||
#define BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(e) \
|
||||
= typename ::boost::asio::default_completion_token<e>::type()
|
||||
|
||||
#else // defined(BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
|
||||
|
||||
#define BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(e)
|
||||
#define BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(e)
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
|
||||
|
||||
} // namespace asio
|
||||
} // namespace boost
|
||||
|
||||
|
|
|
@ -249,7 +249,7 @@ public:
|
|||
* constructed using the @c basic_datagram_socket(const executor_type&)
|
||||
* constructor.
|
||||
*/
|
||||
basic_datagram_socket(basic_datagram_socket&& other) BOOST_ASIO_NOEXCEPT
|
||||
basic_datagram_socket(basic_datagram_socket&& other)
|
||||
: basic_socket<Protocol, Executor>(std::move(other))
|
||||
{
|
||||
}
|
||||
|
@ -448,19 +448,15 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send(this), handler,
|
||||
initiate_async_send(), handler, this,
|
||||
buffers, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -492,20 +488,16 @@ public:
|
|||
* Use the async_send_to function to send data on an unconnected datagram
|
||||
* socket.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send(const ConstBufferSequence& buffers,
|
||||
socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send(this), handler, buffers, flags);
|
||||
initiate_async_send(), handler, this, buffers, flags);
|
||||
}
|
||||
|
||||
/// Send a datagram to the specified endpoint.
|
||||
|
@ -633,20 +625,16 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send_to(const ConstBufferSequence& buffers,
|
||||
const endpoint_type& destination,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send_to(this), handler, buffers,
|
||||
initiate_async_send_to(), handler, this, buffers,
|
||||
destination, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -677,20 +665,16 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send_to(const ConstBufferSequence& buffers,
|
||||
const endpoint_type& destination, socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send_to(this), handler, buffers, destination, flags);
|
||||
initiate_async_send_to(), handler, this, buffers, destination, flags);
|
||||
}
|
||||
|
||||
/// Receive some data on a connected socket.
|
||||
|
@ -818,19 +802,15 @@ public:
|
|||
* multiple buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive(this), handler,
|
||||
initiate_async_receive(), handler, this,
|
||||
buffers, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -862,20 +842,16 @@ public:
|
|||
* Use the async_receive_from function to receive data on an unconnected
|
||||
* datagram socket.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive(const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive(this), handler, buffers, flags);
|
||||
initiate_async_receive(), handler, this, buffers, flags);
|
||||
}
|
||||
|
||||
/// Receive a datagram with the endpoint of the sender.
|
||||
|
@ -1003,20 +979,16 @@ public:
|
|||
* multiple buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive_from(const MutableBufferSequence& buffers,
|
||||
endpoint_type& sender_endpoint,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive_from(this), handler, buffers,
|
||||
initiate_async_receive_from(), handler, this, buffers,
|
||||
&sender_endpoint, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -1049,42 +1021,25 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive_from(const MutableBufferSequence& buffers,
|
||||
endpoint_type& sender_endpoint, socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive_from(this), handler,
|
||||
buffers, &sender_endpoint, flags);
|
||||
initiate_async_receive_from(), handler,
|
||||
this, buffers, &sender_endpoint, flags);
|
||||
}
|
||||
|
||||
private:
|
||||
class initiate_async_send
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_send(basic_datagram_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
struct initiate_async_send
|
||||
{
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
const ConstBufferSequence& buffers,
|
||||
basic_datagram_socket* self, const ConstBufferSequence& buffers,
|
||||
socket_base::message_flags flags) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1092,33 +1047,18 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_send(
|
||||
self->impl_.get_implementation(), buffers, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_datagram_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_send_to
|
||||
struct initiate_async_send_to
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_send_to(basic_datagram_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
const ConstBufferSequence& buffers, const endpoint_type& destination,
|
||||
basic_datagram_socket* self, 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
|
||||
|
@ -1126,33 +1066,17 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_send_to(
|
||||
self->impl_.get_implementation(), buffers, destination, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_datagram_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_receive
|
||||
struct initiate_async_receive
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_receive(basic_datagram_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
const MutableBufferSequence& buffers,
|
||||
basic_datagram_socket* self, const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags flags) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1160,47 +1084,28 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_receive(
|
||||
self->impl_.get_implementation(), buffers, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_datagram_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_receive_from
|
||||
struct initiate_async_receive_from
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_receive_from(basic_datagram_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
const MutableBufferSequence& buffers, endpoint_type* sender_endpoint,
|
||||
socket_base::message_flags flags) const
|
||||
basic_datagram_socket* self, 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.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_receive_from(
|
||||
self->impl_.get_implementation(), buffers, *sender_endpoint, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_datagram_socket* self_;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -133,14 +133,6 @@ 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;
|
||||
|
||||
|
@ -629,17 +621,13 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
WaitHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WaitHandler,
|
||||
template <typename WaitHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WaitHandler,
|
||||
void (boost::system::error_code))
|
||||
async_wait(
|
||||
BOOST_ASIO_MOVE_ARG(WaitHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_wait(BOOST_ASIO_MOVE_ARG(WaitHandler) handler)
|
||||
{
|
||||
return async_initiate<WaitHandler, void (boost::system::error_code)>(
|
||||
initiate_async_wait(this), handler);
|
||||
initiate_async_wait(), handler, this);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -648,36 +636,21 @@ private:
|
|||
basic_deadline_timer& operator=(
|
||||
const basic_deadline_timer&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_wait
|
||||
struct initiate_async_wait
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_wait(basic_deadline_timer* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WaitHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler) const
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler,
|
||||
basic_deadline_timer* 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 WaitHandler.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_wait(
|
||||
self->impl_.get_implementation(), handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_deadline_timer* self_;
|
||||
};
|
||||
|
||||
detail::io_object_impl<
|
||||
|
|
|
@ -247,7 +247,7 @@ public:
|
|||
* constructed using the @c basic_raw_socket(const executor_type&)
|
||||
* constructor.
|
||||
*/
|
||||
basic_raw_socket(basic_raw_socket&& other) BOOST_ASIO_NOEXCEPT
|
||||
basic_raw_socket(basic_raw_socket&& other)
|
||||
: basic_socket<Protocol, Executor>(std::move(other))
|
||||
{
|
||||
}
|
||||
|
@ -440,19 +440,15 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send(this), handler,
|
||||
initiate_async_send(), handler, this,
|
||||
buffers, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -484,20 +480,16 @@ public:
|
|||
* Use the async_send_to function to send data on an unconnected raw
|
||||
* socket.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send(const ConstBufferSequence& buffers,
|
||||
socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send(this), handler, buffers, flags);
|
||||
initiate_async_send(), handler, this, buffers, flags);
|
||||
}
|
||||
|
||||
/// Send raw data to the specified endpoint.
|
||||
|
@ -625,20 +617,16 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send_to(const ConstBufferSequence& buffers,
|
||||
const endpoint_type& destination,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send_to(this), handler, buffers,
|
||||
initiate_async_send_to(), handler, this, buffers,
|
||||
destination, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -669,20 +657,16 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send_to(const ConstBufferSequence& buffers,
|
||||
const endpoint_type& destination, socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send_to(this), handler, buffers, destination, flags);
|
||||
initiate_async_send_to(), handler, this, buffers, destination, flags);
|
||||
}
|
||||
|
||||
/// Receive some data on a connected socket.
|
||||
|
@ -810,19 +794,15 @@ public:
|
|||
* multiple buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive(this), handler,
|
||||
initiate_async_receive(), handler, this,
|
||||
buffers, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -854,20 +834,16 @@ public:
|
|||
* Use the async_receive_from function to receive data on an unconnected
|
||||
* raw socket.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive(const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive(this), handler, buffers, flags);
|
||||
initiate_async_receive(), handler, this, buffers, flags);
|
||||
}
|
||||
|
||||
/// Receive raw data with the endpoint of the sender.
|
||||
|
@ -995,20 +971,16 @@ public:
|
|||
* multiple buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive_from(const MutableBufferSequence& buffers,
|
||||
endpoint_type& sender_endpoint,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive_from(this), handler, buffers,
|
||||
initiate_async_receive_from(), handler, this, buffers,
|
||||
&sender_endpoint, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -1041,42 +1013,25 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive_from(const MutableBufferSequence& buffers,
|
||||
endpoint_type& sender_endpoint, socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive_from(this), handler,
|
||||
buffers, &sender_endpoint, flags);
|
||||
initiate_async_receive_from(), handler,
|
||||
this, buffers, &sender_endpoint, flags);
|
||||
}
|
||||
|
||||
private:
|
||||
class initiate_async_send
|
||||
struct initiate_async_send
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_send(basic_raw_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
const ConstBufferSequence& buffers,
|
||||
basic_raw_socket* self, const ConstBufferSequence& buffers,
|
||||
socket_base::message_flags flags) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1084,33 +1039,18 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_send(
|
||||
self->impl_.get_implementation(), buffers, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_raw_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_send_to
|
||||
struct initiate_async_send_to
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_send_to(basic_raw_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
const ConstBufferSequence& buffers, const endpoint_type& destination,
|
||||
basic_raw_socket* self, 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
|
||||
|
@ -1118,33 +1058,17 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_send_to(
|
||||
self->impl_.get_implementation(), buffers, destination, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_raw_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_receive
|
||||
struct initiate_async_receive
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_receive(basic_raw_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
const MutableBufferSequence& buffers,
|
||||
basic_raw_socket* self, const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags flags) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1152,47 +1076,28 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_receive(
|
||||
self->impl_.get_implementation(), buffers, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_raw_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_receive_from
|
||||
struct initiate_async_receive_from
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_receive_from(basic_raw_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
const MutableBufferSequence& buffers, endpoint_type* sender_endpoint,
|
||||
socket_base::message_flags flags) const
|
||||
basic_raw_socket* self, 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.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_receive_from(
|
||||
self->impl_.get_implementation(), buffers, *sender_endpoint, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_raw_socket* self_;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -256,7 +256,7 @@ public:
|
|||
* constructed using the @c basic_seq_packet_socket(const executor_type&)
|
||||
* constructor.
|
||||
*/
|
||||
basic_seq_packet_socket(basic_seq_packet_socket&& other) BOOST_ASIO_NOEXCEPT
|
||||
basic_seq_packet_socket(basic_seq_packet_socket&& other)
|
||||
: basic_socket<Protocol, Executor>(std::move(other))
|
||||
{
|
||||
}
|
||||
|
@ -429,20 +429,16 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send(const ConstBufferSequence& buffers,
|
||||
socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send(this), handler, buffers, flags);
|
||||
initiate_async_send(), handler, this, buffers, flags);
|
||||
}
|
||||
|
||||
/// Receive some data on the socket.
|
||||
|
@ -602,20 +598,16 @@ public:
|
|||
* multiple buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive(const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags& out_flags,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive_with_flags(this), handler,
|
||||
initiate_async_receive_with_flags(), handler, this,
|
||||
buffers, socket_base::message_flags(0), &out_flags);
|
||||
}
|
||||
|
||||
|
@ -661,43 +653,26 @@ public:
|
|||
* multiple buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive(const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags in_flags,
|
||||
socket_base::message_flags& out_flags,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive_with_flags(this),
|
||||
handler, buffers, in_flags, &out_flags);
|
||||
initiate_async_receive_with_flags(), handler,
|
||||
this, buffers, in_flags, &out_flags);
|
||||
}
|
||||
|
||||
private:
|
||||
class initiate_async_send
|
||||
struct initiate_async_send
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_send(basic_seq_packet_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
const ConstBufferSequence& buffers,
|
||||
basic_seq_packet_socket* self, const ConstBufferSequence& buffers,
|
||||
socket_base::message_flags flags) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -705,33 +680,17 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_send(
|
||||
self->impl_.get_implementation(), buffers, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_seq_packet_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_receive_with_flags
|
||||
struct initiate_async_receive_with_flags
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_receive_with_flags(basic_seq_packet_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
const MutableBufferSequence& buffers,
|
||||
basic_seq_packet_socket* self, const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags in_flags,
|
||||
socket_base::message_flags* out_flags) const
|
||||
{
|
||||
|
@ -740,13 +699,10 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_receive_with_flags(
|
||||
self->impl_.get_implementation(), buffers, in_flags, *out_flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_seq_packet_socket* self_;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -64,14 +64,6 @@ 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;
|
||||
|
@ -690,19 +682,15 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_some(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_write_some(this), handler, buffers);
|
||||
initiate_async_write_some(), handler, this, buffers);
|
||||
}
|
||||
|
||||
/// Read some data from the serial port.
|
||||
|
@ -805,19 +793,15 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_some(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_read_some(this), handler, buffers);
|
||||
initiate_async_read_some(), handler, this, buffers);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -825,70 +809,38 @@ private:
|
|||
basic_serial_port(const basic_serial_port&) BOOST_ASIO_DELETED;
|
||||
basic_serial_port& operator=(const basic_serial_port&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_write_some
|
||||
struct initiate_async_write_some
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_write_some(basic_serial_port* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
const ConstBufferSequence& buffers) const
|
||||
basic_serial_port* self, 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.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_write_some(
|
||||
self->impl_.get_implementation(), buffers, handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_serial_port* self_;
|
||||
};
|
||||
|
||||
class initiate_async_read_some
|
||||
struct initiate_async_read_some
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_read_some(basic_serial_port* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
const MutableBufferSequence& buffers) const
|
||||
basic_serial_port* self, 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.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_read_some(
|
||||
self->impl_.get_implementation(), buffers, handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_serial_port* self_;
|
||||
};
|
||||
|
||||
#if defined(BOOST_ASIO_HAS_IOCP)
|
||||
|
|
|
@ -98,14 +98,6 @@ 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.
|
||||
|
@ -511,17 +503,13 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code, int))
|
||||
SignalHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(SignalHandler,
|
||||
template <typename SignalHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(SignalHandler,
|
||||
void (boost::system::error_code, int))
|
||||
async_wait(
|
||||
BOOST_ASIO_MOVE_ARG(SignalHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_wait(BOOST_ASIO_MOVE_ARG(SignalHandler) handler)
|
||||
{
|
||||
return async_initiate<SignalHandler, void (boost::system::error_code, int)>(
|
||||
initiate_async_wait(this), handler);
|
||||
initiate_async_wait(), handler, this);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -529,36 +517,21 @@ private:
|
|||
basic_signal_set(const basic_signal_set&) BOOST_ASIO_DELETED;
|
||||
basic_signal_set& operator=(const basic_signal_set&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_wait
|
||||
struct initiate_async_wait
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_wait(basic_signal_set* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename SignalHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(SignalHandler) handler) const
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(SignalHandler) handler,
|
||||
basic_signal_set* 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 SignalHandler.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_wait(
|
||||
self->impl_.get_implementation(), handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_signal_set* self_;
|
||||
};
|
||||
|
||||
detail::io_object_impl<detail::signal_set_service, Executor> impl_;
|
||||
|
|
|
@ -295,7 +295,7 @@ public:
|
|||
* @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) BOOST_ASIO_NOEXCEPT
|
||||
basic_socket(basic_socket&& other)
|
||||
: impl_(std::move(other.impl_))
|
||||
{
|
||||
}
|
||||
|
@ -940,14 +940,11 @@ public:
|
|||
* socket.async_connect(endpoint, connect_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
ConnectHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ConnectHandler,
|
||||
template <typename ConnectHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ConnectHandler,
|
||||
void (boost::system::error_code))
|
||||
async_connect(const endpoint_type& peer_endpoint,
|
||||
BOOST_ASIO_MOVE_ARG(ConnectHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ConnectHandler) handler)
|
||||
{
|
||||
boost::system::error_code open_ec;
|
||||
if (!is_open())
|
||||
|
@ -957,7 +954,7 @@ public:
|
|||
}
|
||||
|
||||
return async_initiate<ConnectHandler, void (boost::system::error_code)>(
|
||||
initiate_async_connect(this), handler, peer_endpoint, open_ec);
|
||||
initiate_async_connect(), handler, this, peer_endpoint, open_ec);
|
||||
}
|
||||
|
||||
/// Set an option on the socket.
|
||||
|
@ -1773,17 +1770,13 @@ public:
|
|||
* socket.async_wait(boost::asio::ip::tcp::socket::wait_read, wait_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
WaitHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WaitHandler,
|
||||
template <typename WaitHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WaitHandler,
|
||||
void (boost::system::error_code))
|
||||
async_wait(wait_type w,
|
||||
BOOST_ASIO_MOVE_ARG(WaitHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_wait(wait_type w, BOOST_ASIO_MOVE_ARG(WaitHandler) handler)
|
||||
{
|
||||
return async_initiate<WaitHandler, void (boost::system::error_code)>(
|
||||
initiate_async_wait(this), handler, w);
|
||||
initiate_async_wait(), handler, this, w);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
@ -1812,24 +1805,11 @@ private:
|
|||
basic_socket(const basic_socket&) BOOST_ASIO_DELETED;
|
||||
basic_socket& operator=(const basic_socket&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_connect
|
||||
struct initiate_async_connect
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_connect(basic_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ConnectHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ConnectHandler) handler,
|
||||
const endpoint_type& peer_endpoint,
|
||||
basic_socket* self, const endpoint_type& peer_endpoint,
|
||||
const boost::system::error_code& open_ec) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1838,53 +1818,35 @@ private:
|
|||
|
||||
if (open_ec)
|
||||
{
|
||||
boost::asio::post(self_->impl_.get_executor(),
|
||||
boost::asio::post(self->impl_.get_executor(),
|
||||
boost::asio::detail::bind_handler(
|
||||
BOOST_ASIO_MOVE_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_implementation_executor());
|
||||
self->impl_.get_service().async_connect(
|
||||
self->impl_.get_implementation(), peer_endpoint,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
basic_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_wait
|
||||
struct initiate_async_wait
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_wait(basic_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WaitHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler, wait_type w) const
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler,
|
||||
basic_socket* self, 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.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_wait(
|
||||
self->impl_.get_implementation(), w, handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_socket* self_;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -81,14 +81,6 @@ 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;
|
||||
|
@ -1219,17 +1211,13 @@ public:
|
|||
* wait_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
WaitHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WaitHandler,
|
||||
template <typename WaitHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WaitHandler,
|
||||
void (boost::system::error_code))
|
||||
async_wait(wait_type w,
|
||||
BOOST_ASIO_MOVE_ARG(WaitHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_wait(wait_type w, BOOST_ASIO_MOVE_ARG(WaitHandler) handler)
|
||||
{
|
||||
return async_initiate<WaitHandler, void (boost::system::error_code)>(
|
||||
initiate_async_wait(this), handler, w);
|
||||
initiate_async_wait(), handler, this, w);
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
|
@ -1336,20 +1324,17 @@ public:
|
|||
* acceptor.async_accept(socket, accept_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <typename Protocol1, typename Executor1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
AcceptHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(AcceptHandler,
|
||||
template <typename Protocol1, typename Executor1, typename AcceptHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(AcceptHandler,
|
||||
void (boost::system::error_code))
|
||||
async_accept(basic_socket<Protocol1, Executor1>& peer,
|
||||
BOOST_ASIO_MOVE_ARG(AcceptHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(AcceptHandler) handler,
|
||||
typename enable_if<
|
||||
is_convertible<Protocol, Protocol1>::value
|
||||
>::type* = 0)
|
||||
{
|
||||
return async_initiate<AcceptHandler, void (boost::system::error_code)>(
|
||||
initiate_async_accept(this), handler,
|
||||
initiate_async_accept(), handler, this,
|
||||
&peer, static_cast<endpoint_type*>(0));
|
||||
}
|
||||
|
||||
|
@ -1449,18 +1434,14 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename Executor1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
AcceptHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(AcceptHandler,
|
||||
template <typename Executor1, typename AcceptHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(AcceptHandler,
|
||||
void (boost::system::error_code))
|
||||
async_accept(basic_socket<protocol_type, Executor1>& peer,
|
||||
endpoint_type& peer_endpoint,
|
||||
BOOST_ASIO_MOVE_ARG(AcceptHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
endpoint_type& peer_endpoint, BOOST_ASIO_MOVE_ARG(AcceptHandler) handler)
|
||||
{
|
||||
return async_initiate<AcceptHandler, void (boost::system::error_code)>(
|
||||
initiate_async_accept(this), handler, &peer, &peer_endpoint);
|
||||
initiate_async_accept(), handler, this, &peer, &peer_endpoint);
|
||||
}
|
||||
#endif // !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
|
||||
|
@ -1485,12 +1466,10 @@ public:
|
|||
* boost::asio::ip::tcp::socket socket(acceptor.accept());
|
||||
* @endcode
|
||||
*/
|
||||
typename Protocol::socket::template rebind_executor<executor_type>::other
|
||||
accept()
|
||||
typename Protocol::socket accept()
|
||||
{
|
||||
boost::system::error_code ec;
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
executor_type>::other peer(impl_.get_executor());
|
||||
typename Protocol::socket peer(impl_.get_executor());
|
||||
impl_.get_service().accept(impl_.get_implementation(), peer, 0, ec);
|
||||
boost::asio::detail::throw_error(ec, "accept");
|
||||
return peer;
|
||||
|
@ -1521,11 +1500,9 @@ public:
|
|||
* }
|
||||
* @endcode
|
||||
*/
|
||||
typename Protocol::socket::template rebind_executor<executor_type>::other
|
||||
accept(boost::system::error_code& ec)
|
||||
typename Protocol::socket accept(boost::system::error_code& ec)
|
||||
{
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
executor_type>::other peer(impl_.get_executor());
|
||||
typename Protocol::socket peer(impl_.get_executor());
|
||||
impl_.get_service().accept(impl_.get_implementation(), peer, 0, ec);
|
||||
return peer;
|
||||
}
|
||||
|
@ -1542,11 +1519,8 @@ public:
|
|||
* completes. Copies will be made of the handler as required. The function
|
||||
* signature of the handler must be:
|
||||
* @code void handler(
|
||||
* // Result of operation.
|
||||
* const boost::system::error_code& error,
|
||||
* // On success, the newly accepted socket.
|
||||
* typename Protocol::socket::template
|
||||
* rebind_executor<executor_type>::other peer
|
||||
* const boost::system::error_code& error, // Result of operation.
|
||||
* typename Protocol::socket peer // On success, the newly accepted socket.
|
||||
* ); @endcode
|
||||
* Regardless of whether the asynchronous operation completes immediately or
|
||||
* not, the handler will not be invoked from within this function. On
|
||||
|
@ -1571,26 +1545,16 @@ public:
|
|||
* acceptor.async_accept(accept_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
executor_type>::other)) MoveAcceptHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(MoveAcceptHandler,
|
||||
void (boost::system::error_code,
|
||||
typename Protocol::socket::template
|
||||
rebind_executor<executor_type>::other))
|
||||
async_accept(
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
template <typename MoveAcceptHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler,
|
||||
void (boost::system::error_code, typename Protocol::socket))
|
||||
async_accept(BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler)
|
||||
{
|
||||
return async_initiate<MoveAcceptHandler,
|
||||
void (boost::system::error_code, typename Protocol::socket::template
|
||||
rebind_executor<executor_type>::other)>(
|
||||
initiate_async_move_accept(this), handler,
|
||||
impl_.get_executor(), static_cast<endpoint_type*>(0),
|
||||
static_cast<typename Protocol::socket::template
|
||||
rebind_executor<executor_type>::other*>(0));
|
||||
void (boost::system::error_code, typename Protocol::socket)>(
|
||||
initiate_async_move_accept(), handler, this,
|
||||
impl_.get_executor(), static_cast<endpoint_type*>(0),
|
||||
static_cast<typename Protocol::socket*>(0));
|
||||
}
|
||||
|
||||
/// Accept a new connection.
|
||||
|
@ -1795,18 +1759,13 @@ public:
|
|||
* acceptor.async_accept(my_context2, accept_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <typename Executor1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
Executor1>::other)) MoveAcceptHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(MoveAcceptHandler,
|
||||
template <typename Executor1, typename MoveAcceptHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler,
|
||||
void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
Executor1>::other))
|
||||
async_accept(const Executor1& ex,
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler,
|
||||
typename enable_if<
|
||||
is_executor<Executor1>::value
|
||||
>::type* = 0)
|
||||
|
@ -1816,7 +1775,7 @@ public:
|
|||
|
||||
return async_initiate<MoveAcceptHandler,
|
||||
void (boost::system::error_code, other_socket_type)>(
|
||||
initiate_async_move_accept(this), handler,
|
||||
initiate_async_move_accept(), handler, this,
|
||||
ex, static_cast<endpoint_type*>(0),
|
||||
static_cast<other_socket_type*>(0));
|
||||
}
|
||||
|
@ -1864,18 +1823,13 @@ public:
|
|||
* acceptor.async_accept(my_context2, accept_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <typename ExecutionContext,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
typename ExecutionContext::executor_type>::other)) MoveAcceptHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(MoveAcceptHandler,
|
||||
template <typename ExecutionContext, typename MoveAcceptHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler,
|
||||
void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
typename ExecutionContext::executor_type>::other))
|
||||
async_accept(ExecutionContext& context,
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler,
|
||||
typename enable_if<
|
||||
is_convertible<ExecutionContext&, execution_context&>::value
|
||||
>::type* = 0)
|
||||
|
@ -1885,7 +1839,7 @@ public:
|
|||
|
||||
return async_initiate<MoveAcceptHandler,
|
||||
void (boost::system::error_code, other_socket_type)>(
|
||||
initiate_async_move_accept(this), handler,
|
||||
initiate_async_move_accept(), handler, this,
|
||||
context.get_executor(), static_cast<endpoint_type*>(0),
|
||||
static_cast<other_socket_type*>(0));
|
||||
}
|
||||
|
@ -1914,12 +1868,10 @@ public:
|
|||
* boost::asio::ip::tcp::socket socket(acceptor.accept(endpoint));
|
||||
* @endcode
|
||||
*/
|
||||
typename Protocol::socket::template rebind_executor<executor_type>::other
|
||||
accept(endpoint_type& peer_endpoint)
|
||||
typename Protocol::socket accept(endpoint_type& peer_endpoint)
|
||||
{
|
||||
boost::system::error_code ec;
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
executor_type>::other peer(impl_.get_executor());
|
||||
typename Protocol::socket peer(impl_.get_executor());
|
||||
impl_.get_service().accept(impl_.get_implementation(),
|
||||
peer, &peer_endpoint, ec);
|
||||
boost::asio::detail::throw_error(ec, "accept");
|
||||
|
@ -1955,11 +1907,10 @@ public:
|
|||
* }
|
||||
* @endcode
|
||||
*/
|
||||
typename Protocol::socket::template rebind_executor<executor_type>::other
|
||||
accept(endpoint_type& peer_endpoint, boost::system::error_code& ec)
|
||||
typename Protocol::socket accept(
|
||||
endpoint_type& peer_endpoint, boost::system::error_code& ec)
|
||||
{
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
executor_type>::other peer(impl_.get_executor());
|
||||
typename Protocol::socket peer(impl_.get_executor());
|
||||
impl_.get_service().accept(impl_.get_implementation(),
|
||||
peer, &peer_endpoint, ec);
|
||||
return peer;
|
||||
|
@ -1982,11 +1933,8 @@ public:
|
|||
* completes. Copies will be made of the handler as required. The function
|
||||
* signature of the handler must be:
|
||||
* @code void handler(
|
||||
* // Result of operation.
|
||||
* const boost::system::error_code& error,
|
||||
* // On success, the newly accepted socket.
|
||||
* typename Protocol::socket::template
|
||||
* rebind_executor<executor_type>::other peer
|
||||
* const boost::system::error_code& error, // Result of operation.
|
||||
* typename Protocol::socket peer // On success, the newly accepted socket.
|
||||
* ); @endcode
|
||||
* Regardless of whether the asynchronous operation completes immediately or
|
||||
* not, the handler will not be invoked from within this function. On
|
||||
|
@ -2012,26 +1960,17 @@ public:
|
|||
* acceptor.async_accept(endpoint, accept_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
executor_type>::other)) MoveAcceptHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(MoveAcceptHandler,
|
||||
void (boost::system::error_code,
|
||||
typename Protocol::socket::template
|
||||
rebind_executor<executor_type>::other))
|
||||
template <typename MoveAcceptHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler,
|
||||
void (boost::system::error_code, typename Protocol::socket))
|
||||
async_accept(endpoint_type& peer_endpoint,
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler)
|
||||
{
|
||||
return async_initiate<MoveAcceptHandler,
|
||||
void (boost::system::error_code, typename Protocol::socket::template
|
||||
rebind_executor<executor_type>::other)>(
|
||||
initiate_async_move_accept(this), handler,
|
||||
impl_.get_executor(), &peer_endpoint,
|
||||
static_cast<typename Protocol::socket::template
|
||||
rebind_executor<executor_type>::other*>(0));
|
||||
void (boost::system::error_code, typename Protocol::socket)>(
|
||||
initiate_async_move_accept(), handler, this,
|
||||
impl_.get_executor(), &peer_endpoint,
|
||||
static_cast<typename Protocol::socket*>(0));
|
||||
}
|
||||
|
||||
/// Accept a new connection.
|
||||
|
@ -2268,18 +2207,13 @@ public:
|
|||
* acceptor.async_accept(my_context2, endpoint, accept_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <typename Executor1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
Executor1>::other)) MoveAcceptHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(MoveAcceptHandler,
|
||||
template <typename Executor1, typename MoveAcceptHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler,
|
||||
void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
Executor1>::other))
|
||||
async_accept(const Executor1& ex, endpoint_type& peer_endpoint,
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler,
|
||||
typename enable_if<
|
||||
is_executor<Executor1>::value
|
||||
>::type* = 0)
|
||||
|
@ -2289,7 +2223,7 @@ public:
|
|||
|
||||
return async_initiate<MoveAcceptHandler,
|
||||
void (boost::system::error_code, other_socket_type)>(
|
||||
initiate_async_move_accept(this), handler,
|
||||
initiate_async_move_accept(), handler, this,
|
||||
ex, &peer_endpoint,
|
||||
static_cast<other_socket_type*>(0));
|
||||
}
|
||||
|
@ -2343,19 +2277,14 @@ public:
|
|||
* acceptor.async_accept(my_context2, endpoint, accept_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <typename ExecutionContext,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
typename ExecutionContext::executor_type>::other)) MoveAcceptHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(MoveAcceptHandler,
|
||||
template <typename ExecutionContext, typename MoveAcceptHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler,
|
||||
void (boost::system::error_code,
|
||||
typename Protocol::socket::template rebind_executor<
|
||||
typename ExecutionContext::executor_type>::other))
|
||||
async_accept(ExecutionContext& context,
|
||||
endpoint_type& peer_endpoint,
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler,
|
||||
typename enable_if<
|
||||
is_convertible<ExecutionContext&, execution_context&>::value
|
||||
>::type* = 0)
|
||||
|
@ -2365,7 +2294,7 @@ public:
|
|||
|
||||
return async_initiate<MoveAcceptHandler,
|
||||
void (boost::system::error_code, other_socket_type)>(
|
||||
initiate_async_move_accept(this), handler,
|
||||
initiate_async_move_accept(), handler, this,
|
||||
context.get_executor(), &peer_endpoint,
|
||||
static_cast<other_socket_type*>(0));
|
||||
}
|
||||
|
@ -2377,56 +2306,28 @@ private:
|
|||
basic_socket_acceptor& operator=(
|
||||
const basic_socket_acceptor&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_wait
|
||||
struct initiate_async_wait
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_wait(basic_socket_acceptor* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WaitHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler, wait_type w) const
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler,
|
||||
basic_socket_acceptor* self, 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.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_wait(
|
||||
self->impl_.get_implementation(), w, handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_socket_acceptor* self_;
|
||||
};
|
||||
|
||||
class initiate_async_accept
|
||||
struct initiate_async_accept
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_accept(basic_socket_acceptor* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename AcceptHandler, typename Protocol1, typename Executor1>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(AcceptHandler) handler,
|
||||
basic_socket<Protocol1, Executor1>* peer,
|
||||
basic_socket_acceptor* self, basic_socket<Protocol1, Executor1>* peer,
|
||||
endpoint_type* peer_endpoint) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -2434,33 +2335,18 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_accept(
|
||||
self->impl_.get_implementation(), *peer, peer_endpoint,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_socket_acceptor* self_;
|
||||
};
|
||||
|
||||
class initiate_async_move_accept
|
||||
struct initiate_async_move_accept
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_move_accept(basic_socket_acceptor* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename MoveAcceptHandler, typename Executor1, typename Socket>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(MoveAcceptHandler) handler,
|
||||
const Executor1& peer_ex, endpoint_type* peer_endpoint, Socket*) const
|
||||
basic_socket_acceptor* self, 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.
|
||||
|
@ -2468,13 +2354,10 @@ private:
|
|||
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_implementation_executor());
|
||||
self->impl_.get_service().async_move_accept(
|
||||
self->impl_.get_implementation(), peer_ex, peer_endpoint,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_socket_acceptor* self_;
|
||||
};
|
||||
|
||||
#if defined(BOOST_ASIO_WINDOWS_RUNTIME)
|
||||
|
|
|
@ -254,7 +254,7 @@ public:
|
|||
* constructed using the @c basic_stream_socket(const executor_type&)
|
||||
* constructor.
|
||||
*/
|
||||
basic_stream_socket(basic_stream_socket&& other) BOOST_ASIO_NOEXCEPT
|
||||
basic_stream_socket(basic_stream_socket&& other)
|
||||
: basic_socket<Protocol, Executor>(std::move(other))
|
||||
{
|
||||
}
|
||||
|
@ -464,19 +464,15 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send(this), handler,
|
||||
initiate_async_send(), handler, this,
|
||||
buffers, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -517,20 +513,16 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_send(const ConstBufferSequence& buffers,
|
||||
socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send(this), handler, buffers, flags);
|
||||
initiate_async_send(), handler, this, buffers, flags);
|
||||
}
|
||||
|
||||
/// Receive some data on the socket.
|
||||
|
@ -675,19 +667,15 @@ public:
|
|||
* multiple buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive(this), handler,
|
||||
initiate_async_receive(), handler, this,
|
||||
buffers, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -730,20 +718,16 @@ public:
|
|||
* multiple buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_receive(const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags flags,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive(this), handler, buffers, flags);
|
||||
initiate_async_receive(), handler, this, buffers, flags);
|
||||
}
|
||||
|
||||
/// Write some data to the socket.
|
||||
|
@ -842,19 +826,15 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_some(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_send(this), handler,
|
||||
initiate_async_send(), handler, this,
|
||||
buffers, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
|
@ -957,41 +937,24 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_some(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_receive(this), handler,
|
||||
initiate_async_receive(), handler, this,
|
||||
buffers, socket_base::message_flags(0));
|
||||
}
|
||||
|
||||
private:
|
||||
class initiate_async_send
|
||||
struct initiate_async_send
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_send(basic_stream_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
const ConstBufferSequence& buffers,
|
||||
basic_stream_socket* self, const ConstBufferSequence& buffers,
|
||||
socket_base::message_flags flags) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -999,33 +962,17 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_send(
|
||||
self->impl_.get_implementation(), buffers, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_stream_socket* self_;
|
||||
};
|
||||
|
||||
class initiate_async_receive
|
||||
struct initiate_async_receive
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_receive(basic_stream_socket* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
const MutableBufferSequence& buffers,
|
||||
basic_stream_socket* self, const MutableBufferSequence& buffers,
|
||||
socket_base::message_flags flags) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1033,13 +980,10 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_receive(
|
||||
self->impl_.get_implementation(), buffers, flags,
|
||||
handler2.value, self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_stream_socket* self_;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -146,14 +146,6 @@ 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;
|
||||
|
||||
|
@ -700,17 +692,13 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
WaitHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WaitHandler,
|
||||
template <typename WaitHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WaitHandler,
|
||||
void (boost::system::error_code))
|
||||
async_wait(
|
||||
BOOST_ASIO_MOVE_ARG(WaitHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_wait(BOOST_ASIO_MOVE_ARG(WaitHandler) handler)
|
||||
{
|
||||
return async_initiate<WaitHandler, void (boost::system::error_code)>(
|
||||
initiate_async_wait(this), handler);
|
||||
initiate_async_wait(), handler, this);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -719,36 +707,21 @@ private:
|
|||
basic_waitable_timer& operator=(
|
||||
const basic_waitable_timer&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_wait
|
||||
struct initiate_async_wait
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_wait(basic_waitable_timer* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WaitHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler) const
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler,
|
||||
basic_waitable_timer* 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 WaitHandler.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_wait(
|
||||
self->impl_.get_implementation(), handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_waitable_timer* self_;
|
||||
};
|
||||
|
||||
detail::io_object_impl<
|
||||
|
|
|
@ -137,15 +137,11 @@ public:
|
|||
|
||||
/// Start an asynchronous write. The data being written must be valid for the
|
||||
/// lifetime of the asynchronous operation.
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_some(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return next_layer_.async_write_some(buffers,
|
||||
BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
|
||||
|
@ -160,15 +156,10 @@ public:
|
|||
std::size_t fill(boost::system::error_code& ec);
|
||||
|
||||
/// Start an asynchronous fill.
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_fill(
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type));
|
||||
async_fill(BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
/// Read some data from the stream. Returns the number of bytes read. Throws
|
||||
/// an exception on failure.
|
||||
|
@ -183,15 +174,11 @@ public:
|
|||
|
||||
/// Start an asynchronous read. The buffer into which the data will be read
|
||||
/// must be valid for the lifetime of the asynchronous operation.
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_some(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
/// Peek at the incoming data on the stream. Returns the number of bytes read.
|
||||
/// Throws an exception on failure.
|
||||
|
|
|
@ -126,15 +126,10 @@ public:
|
|||
}
|
||||
|
||||
/// Start an asynchronous flush.
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_flush(
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_flush(BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return stream_impl_.next_layer().async_flush(
|
||||
BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
|
||||
|
@ -159,15 +154,11 @@ public:
|
|||
|
||||
/// Start an asynchronous write. The data being written must be valid for the
|
||||
/// lifetime of the asynchronous operation.
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_some(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return stream_impl_.async_write_some(buffers,
|
||||
BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
|
||||
|
@ -188,15 +179,10 @@ public:
|
|||
}
|
||||
|
||||
/// Start an asynchronous fill.
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_fill(
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_fill(BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return stream_impl_.async_fill(BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
|
||||
}
|
||||
|
@ -220,15 +206,11 @@ public:
|
|||
|
||||
/// Start an asynchronous read. The buffer into which the data will be read
|
||||
/// must be valid for the lifetime of the asynchronous operation.
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_some(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return stream_impl_.async_read_some(buffers,
|
||||
BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
|
||||
|
|
|
@ -129,15 +129,10 @@ public:
|
|||
std::size_t flush(boost::system::error_code& ec);
|
||||
|
||||
/// Start an asynchronous flush.
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_flush(
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type));
|
||||
async_flush(BOOST_ASIO_MOVE_ARG(WriteHandler) handler);
|
||||
|
||||
/// Write the given data to the stream. Returns the number of bytes written.
|
||||
/// Throws an exception on failure.
|
||||
|
@ -152,15 +147,11 @@ public:
|
|||
|
||||
/// Start an asynchronous write. The data being written must be valid for the
|
||||
/// lifetime of the asynchronous operation.
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_some(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler);
|
||||
|
||||
/// Read some data from the stream. Returns the number of bytes read. Throws
|
||||
/// an exception on failure.
|
||||
|
@ -181,15 +172,11 @@ public:
|
|||
|
||||
/// Start an asynchronous read. The buffer into which the data will be read
|
||||
/// must be valid for the lifetime of the asynchronous operation.
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_some(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return next_layer_.async_read_some(buffers,
|
||||
BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
|
||||
|
|
|
@ -54,15 +54,10 @@ struct awaitable_signature<awaitable<void, Executor>>
|
|||
*
|
||||
* where @c E is convertible from @c Executor.
|
||||
*/
|
||||
template <typename Executor, typename F,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(typename detail::awaitable_signature<
|
||||
typename result_of<F()>::type>::type) CompletionToken
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken,
|
||||
template <typename Executor, typename F, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken,
|
||||
typename detail::awaitable_signature<typename result_of<F()>::type>::type)
|
||||
co_spawn(const Executor& ex, F&& f,
|
||||
CompletionToken&& token
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
|
||||
co_spawn(const Executor& ex, F&& f, CompletionToken&& token,
|
||||
typename enable_if<
|
||||
is_executor<Executor>::value
|
||||
>::type* = 0);
|
||||
|
@ -75,17 +70,10 @@ co_spawn(const Executor& ex, F&& f,
|
|||
*
|
||||
* where @c E is convertible from @c ExecutionContext::executor_type.
|
||||
*/
|
||||
template <typename ExecutionContext, typename F,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(typename detail::awaitable_signature<
|
||||
typename result_of<F()>::type>::type) CompletionToken
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename ExecutionContext::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken,
|
||||
template <typename ExecutionContext, typename F, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken,
|
||||
typename detail::awaitable_signature<typename result_of<F()>::type>::type)
|
||||
co_spawn(ExecutionContext& ctx, F&& f,
|
||||
CompletionToken&& token
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename ExecutionContext::executor_type),
|
||||
co_spawn(ExecutionContext& ctx, F&& f, CompletionToken&& token,
|
||||
typename enable_if<
|
||||
is_convertible<ExecutionContext&, execution_context&>::value
|
||||
>::type* = 0);
|
||||
|
|
|
@ -101,7 +101,7 @@ namespace asio {
|
|||
*/
|
||||
template <typename CompletionToken, typename Signature,
|
||||
typename Implementation, typename... IoObjectsOrExecutors>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, Signature)
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)
|
||||
async_compose(BOOST_ASIO_MOVE_ARG(Implementation) implementation,
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token,
|
||||
BOOST_ASIO_MOVE_ARG(IoObjectsOrExecutors)... io_objects_or_executors);
|
||||
|
@ -110,14 +110,14 @@ async_compose(BOOST_ASIO_MOVE_ARG(Implementation) implementation,
|
|||
// || defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename CompletionToken, typename Signature, typename Implementation>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, Signature)
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)
|
||||
async_compose(BOOST_ASIO_MOVE_ARG(Implementation) implementation,
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token);
|
||||
|
||||
#define BOOST_ASIO_PRIVATE_ASYNC_COMPOSE_DEF(n) \
|
||||
template <typename CompletionToken, typename Signature, \
|
||||
typename Implementation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, Signature) \
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature) \
|
||||
async_compose(BOOST_ASIO_MOVE_ARG(Implementation) implementation, \
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
|
||||
BOOST_ASIO_VARIADIC_MOVE_PARAMS(n));
|
||||
|
|
|
@ -666,16 +666,13 @@ Iterator connect(basic_socket<Protocol, Executor>& s,
|
|||
* // ...
|
||||
* } @endcode
|
||||
*/
|
||||
template <typename Protocol, typename Executor, typename EndpointSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::endpoint)) RangeConnectHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(RangeConnectHandler,
|
||||
template <typename Protocol, typename Executor,
|
||||
typename EndpointSequence, typename RangeConnectHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
|
||||
void (boost::system::error_code, typename Protocol::endpoint))
|
||||
async_connect(basic_socket<Protocol, Executor>& s,
|
||||
const EndpointSequence& endpoints,
|
||||
BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
|
||||
BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler,
|
||||
typename enable_if<is_endpoint_sequence<
|
||||
EndpointSequence>::value>::type* = 0);
|
||||
|
||||
|
@ -715,15 +712,12 @@ async_connect(basic_socket<Protocol, Executor>& s,
|
|||
* Iterator represents the end of the sequence. This is a valid assumption for
|
||||
* iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
|
||||
*/
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
Iterator)) IteratorConnectHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
|
||||
template <typename Protocol, typename Executor,
|
||||
typename Iterator, typename IteratorConnectHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator))
|
||||
async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler,
|
||||
typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
|
||||
#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
|
||||
|
||||
|
@ -776,15 +770,12 @@ async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
|||
* // ...
|
||||
* } @endcode
|
||||
*/
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
Iterator)) IteratorConnectHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
|
||||
template <typename Protocol, typename Executor,
|
||||
typename Iterator, typename IteratorConnectHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator))
|
||||
async_connect(basic_socket<Protocol, Executor>& s, Iterator begin, Iterator end,
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor));
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler);
|
||||
|
||||
/// Asynchronously establishes a socket connection by trying each endpoint in a
|
||||
/// sequence.
|
||||
|
@ -881,17 +872,13 @@ async_connect(basic_socket<Protocol, Executor>& s, Iterator begin, Iterator end,
|
|||
* }
|
||||
* } @endcode
|
||||
*/
|
||||
template <typename Protocol, typename Executor,
|
||||
typename EndpointSequence, typename ConnectCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::endpoint)) RangeConnectHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(RangeConnectHandler,
|
||||
template <typename Protocol, typename Executor, typename EndpointSequence,
|
||||
typename ConnectCondition, typename RangeConnectHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
|
||||
void (boost::system::error_code, typename Protocol::endpoint))
|
||||
async_connect(basic_socket<Protocol, Executor>& s,
|
||||
const EndpointSequence& endpoints, ConnectCondition connect_condition,
|
||||
BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
|
||||
BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler,
|
||||
typename enable_if<is_endpoint_sequence<
|
||||
EndpointSequence>::value>::type* = 0);
|
||||
|
||||
|
@ -942,17 +929,13 @@ async_connect(basic_socket<Protocol, Executor>& s,
|
|||
* Iterator represents the end of the sequence. This is a valid assumption for
|
||||
* iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
|
||||
*/
|
||||
template <typename Protocol, typename Executor,
|
||||
typename Iterator, typename ConnectCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
Iterator)) IteratorConnectHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
typename ConnectCondition, typename IteratorConnectHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator))
|
||||
async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
||||
ConnectCondition connect_condition,
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler,
|
||||
typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
|
||||
#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
|
||||
|
||||
|
@ -1054,17 +1037,13 @@ async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
|||
* }
|
||||
* } @endcode
|
||||
*/
|
||||
template <typename Protocol, typename Executor,
|
||||
typename Iterator, typename ConnectCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
Iterator)) IteratorConnectHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
typename ConnectCondition, typename IteratorConnectHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator))
|
||||
async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
||||
Iterator end, ConnectCondition connect_condition,
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor));
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler);
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
|
|
@ -55,8 +55,8 @@ namespace asio {
|
|||
*
|
||||
* @li Returns <tt>result.get()</tt>.
|
||||
*/
|
||||
template <BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
template <typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token);
|
||||
|
||||
/// Submits a completion token or function object for execution.
|
||||
|
@ -94,28 +94,18 @@ BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer(
|
|||
*
|
||||
* @li Returns <tt>result.get()</tt>.
|
||||
*/
|
||||
template <typename Executor,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
const Executor& ex,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
|
||||
template <typename Executor, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
const Executor& ex, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_executor<Executor>::value>::type* = 0);
|
||||
|
||||
/// Submits a completion token or function object for execution.
|
||||
/**
|
||||
* @returns <tt>defer(ctx.get_executor(), forward<CompletionToken>(token))</tt>.
|
||||
*/
|
||||
template <typename ExecutionContext,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename ExecutionContext::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
ExecutionContext& ctx,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename ExecutionContext::executor_type),
|
||||
template <typename ExecutionContext, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
ExecutionContext& ctx, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_convertible<
|
||||
ExecutionContext&, execution_context&>::value>::type* = 0);
|
||||
|
||||
|
|
|
@ -314,42 +314,6 @@
|
|||
# endif // !defined(BOOST_ASIO_DISABLE_ALIAS_TEMPLATES)
|
||||
#endif // !defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES)
|
||||
|
||||
// Support return type deduction on compilers known to allow it.
|
||||
#if !defined(BOOST_ASIO_HAS_RETURN_TYPE_DEDUCTION)
|
||||
# if !defined(BOOST_ASIO_DISABLE_RETURN_TYPE_DEDUCTION)
|
||||
# if defined(__clang__)
|
||||
# if __has_feature(__cxx_return_type_deduction__)
|
||||
# define BOOST_ASIO_HAS_RETURN_TYPE_DEDUCTION 1
|
||||
# endif // __has_feature(__cxx_alias_templates__)
|
||||
# elif (__cplusplus >= 201402)
|
||||
# define BOOST_ASIO_HAS_RETURN_TYPE_DEDUCTION 1
|
||||
# elif defined(__cpp_return_type_deduction)
|
||||
# if (__cpp_return_type_deduction >= 201304)
|
||||
# define BOOST_ASIO_HAS_RETURN_TYPE_DEDUCTION 1
|
||||
# endif // (__cpp_return_type_deduction >= 201304)
|
||||
# endif // defined(__cpp_return_type_deduction)
|
||||
# endif // !defined(BOOST_ASIO_DISABLE_RETURN_TYPE_DEDUCTION)
|
||||
#endif // !defined(BOOST_ASIO_HAS_RETURN_TYPE_DEDUCTION)
|
||||
|
||||
// Support default function template arguments on compilers known to allow it.
|
||||
#if !defined(BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
|
||||
# if !defined(BOOST_ASIO_DISABLE_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
|
||||
# if (__cplusplus >= 201103)
|
||||
# define BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS 1
|
||||
# endif // (__cplusplus >= 201103)
|
||||
# endif // !defined(BOOST_ASIO_DISABLE_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
|
||||
#endif // !defined(BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
|
||||
|
||||
// Support concepts on compilers known to allow them.
|
||||
#if !defined(BOOST_ASIO_HAS_CONCEPTS)
|
||||
# if !defined(BOOST_ASIO_DISABLE_CONCEPTS)
|
||||
# if __cpp_concepts
|
||||
# define BOOST_ASIO_HAS_CONCEPTS 1
|
||||
# define BOOST_ASIO_CONCEPT concept bool
|
||||
# endif // __cpp_concepts
|
||||
# endif // !defined(BOOST_ASIO_DISABLE_CONCEPTS)
|
||||
#endif // !defined(BOOST_ASIO_HAS_CONCEPTS)
|
||||
|
||||
// Standard library support for system errors.
|
||||
# if !defined(BOOST_ASIO_DISABLE_STD_SYSTEM_ERROR)
|
||||
# if defined(__clang__)
|
||||
|
|
|
@ -49,7 +49,6 @@ void reactive_socket_service_base::construct(
|
|||
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)
|
||||
BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
impl.socket_ = other_impl.socket_;
|
||||
other_impl.socket_ = invalid_socket;
|
||||
|
|
|
@ -84,7 +84,7 @@ boost::system::error_code win_iocp_serial_port_service::open(
|
|||
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.BaudRate = 0; // 0 baud by default
|
||||
dcb.ByteSize = 8; // 8 bit bytes
|
||||
dcb.fOutxCtsFlow = FALSE; // No flow control
|
||||
dcb.fOutxDsrFlow = FALSE;
|
||||
|
@ -92,7 +92,7 @@ boost::system::error_code win_iocp_serial_port_service::open(
|
|||
dcb.fDsrSensitivity = FALSE;
|
||||
dcb.fOutX = FALSE;
|
||||
dcb.fInX = FALSE;
|
||||
dcb.fRtsControl = RTS_CONTROL_DISABLE;
|
||||
dcb.fRtsControl = DTR_CONTROL_DISABLE;
|
||||
dcb.fParity = FALSE; // No parity
|
||||
dcb.Parity = NOPARITY;
|
||||
dcb.StopBits = ONESTOPBIT; // One stop bit
|
||||
|
|
|
@ -73,7 +73,6 @@ void win_iocp_socket_service_base::construct(
|
|||
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)
|
||||
BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
impl.socket_ = other_impl.socket_;
|
||||
other_impl.socket_ = invalid_socket;
|
||||
|
|
|
@ -89,7 +89,7 @@ public:
|
|||
|
||||
// Move-construct a new socket implementation.
|
||||
void move_construct(implementation_type& impl,
|
||||
implementation_type& other_impl) BOOST_ASIO_NOEXCEPT
|
||||
implementation_type& other_impl)
|
||||
{
|
||||
this->base_move_construct(impl, other_impl);
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ public:
|
|||
|
||||
// Move-construct a new socket implementation.
|
||||
BOOST_ASIO_DECL void base_move_construct(base_implementation_type& impl,
|
||||
base_implementation_type& other_impl) BOOST_ASIO_NOEXCEPT;
|
||||
base_implementation_type& other_impl);
|
||||
|
||||
// Move-assign from another socket implementation.
|
||||
BOOST_ASIO_DECL void base_move_assign(base_implementation_type& impl,
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
# include <boost/type_traits/is_same.hpp>
|
||||
# include <boost/type_traits/remove_pointer.hpp>
|
||||
# include <boost/type_traits/remove_reference.hpp>
|
||||
# include <boost/utility/declval.hpp>
|
||||
# include <boost/utility/enable_if.hpp>
|
||||
# include <boost/utility/result_of.hpp>
|
||||
#endif // defined(BOOST_ASIO_HAS_TYPE_TRAITS)
|
||||
|
@ -44,7 +43,6 @@ namespace asio {
|
|||
using std::add_const;
|
||||
using std::conditional;
|
||||
using std::decay;
|
||||
using std::declval;
|
||||
using std::enable_if;
|
||||
using std::false_type;
|
||||
using std::integral_constant;
|
||||
|
@ -70,7 +68,6 @@ template <bool Condition, typename Type = void>
|
|||
struct enable_if : boost::enable_if_c<Condition, Type> {};
|
||||
using boost::conditional;
|
||||
using boost::decay;
|
||||
using boost::declval;
|
||||
using boost::false_type;
|
||||
using boost::integral_constant;
|
||||
using boost::is_base_of;
|
||||
|
|
|
@ -108,24 +108,6 @@
|
|||
BOOST_ASIO_MOVE_CAST(T3)(x3), BOOST_ASIO_MOVE_CAST(T4)(x4), \
|
||||
BOOST_ASIO_MOVE_CAST(T5)(x5)
|
||||
|
||||
# define BOOST_ASIO_VARIADIC_MOVE_DECLVAL(n) \
|
||||
BOOST_ASIO_VARIADIC_MOVE_DECLVAL_##n
|
||||
|
||||
# define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_1 \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T1)>()
|
||||
# define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_2 \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>()
|
||||
# define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_3 \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T3)>()
|
||||
# define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_4 \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T3)>(), declval<BOOST_ASIO_MOVE_ARG(T4)>()
|
||||
# define BOOST_ASIO_VARIADIC_MOVE_DECLVAL_5 \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T1)>(), declval<BOOST_ASIO_MOVE_ARG(T2)>(), \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T3)>(), declval<BOOST_ASIO_MOVE_ARG(T4)>(), \
|
||||
declval<BOOST_ASIO_MOVE_ARG(T5)>()
|
||||
|
||||
# define BOOST_ASIO_VARIADIC_DECAY(n) \
|
||||
BOOST_ASIO_VARIADIC_DECAY_##n
|
||||
|
||||
|
|
|
@ -100,7 +100,6 @@ public:
|
|||
if (ec == boost::asio::error::connection_aborted
|
||||
&& !o->enable_connection_aborted_)
|
||||
{
|
||||
handler_work<Handler, IoExecutor>::start(o->handler_, o->io_executor_);
|
||||
o->reset();
|
||||
o->socket_service_.restart_accept_op(o->socket_,
|
||||
o->new_socket_, o->protocol_.family(),
|
||||
|
@ -230,7 +229,6 @@ public:
|
|||
if (ec == boost::asio::error::connection_aborted
|
||||
&& !o->enable_connection_aborted_)
|
||||
{
|
||||
handler_work<Handler, IoExecutor>::start(o->handler_, o->io_executor_);
|
||||
o->reset();
|
||||
o->socket_service_.restart_accept_op(o->socket_,
|
||||
o->new_socket_, o->protocol_.family(),
|
||||
|
|
|
@ -145,7 +145,7 @@ public:
|
|||
|
||||
// Move-construct a new socket implementation.
|
||||
void move_construct(implementation_type& impl,
|
||||
implementation_type& other_impl) BOOST_ASIO_NOEXCEPT
|
||||
implementation_type& other_impl)
|
||||
{
|
||||
this->base_move_construct(impl, other_impl);
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ public:
|
|||
|
||||
// Move-construct a new socket implementation.
|
||||
BOOST_ASIO_DECL void base_move_construct(base_implementation_type& impl,
|
||||
base_implementation_type& other_impl) BOOST_ASIO_NOEXCEPT;
|
||||
base_implementation_type& other_impl);
|
||||
|
||||
// Move-assign from another socket implementation.
|
||||
BOOST_ASIO_DECL void base_move_assign(base_implementation_type& impl,
|
||||
|
|
|
@ -50,8 +50,8 @@ namespace asio {
|
|||
*
|
||||
* @li Returns <tt>result.get()</tt>.
|
||||
*/
|
||||
template <BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
template <typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token);
|
||||
|
||||
/// Submits a completion token or function object for execution.
|
||||
|
@ -84,13 +84,9 @@ BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) dispatch(
|
|||
*
|
||||
* @li Returns <tt>result.get()</tt>.
|
||||
*/
|
||||
template <typename Executor,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
const Executor& ex,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
|
||||
template <typename Executor, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
const Executor& ex, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_executor<Executor>::value>::type* = 0);
|
||||
|
||||
/// Submits a completion token or function object for execution.
|
||||
|
@ -98,15 +94,9 @@ BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) dispatch(
|
|||
* @returns <tt>dispatch(ctx.get_executor(),
|
||||
* forward<CompletionToken>(token))</tt>.
|
||||
*/
|
||||
template <typename ExecutionContext,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename ExecutionContext::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
ExecutionContext& ctx,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename ExecutionContext::executor_type),
|
||||
template <typename ExecutionContext, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
ExecutionContext& ctx, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_convertible<
|
||||
ExecutionContext&, execution_context&>::value>::type* = 0);
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ public:
|
|||
#endif
|
||||
|
||||
/// Default constructor.
|
||||
basic_endpoint() BOOST_ASIO_NOEXCEPT
|
||||
basic_endpoint()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -74,19 +74,19 @@ public:
|
|||
}
|
||||
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(SOCK_DGRAM);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return protocol_;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return family_;
|
||||
}
|
||||
|
|
|
@ -74,19 +74,19 @@ public:
|
|||
}
|
||||
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(SOCK_RAW);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return protocol_;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return family_;
|
||||
}
|
||||
|
|
|
@ -73,19 +73,19 @@ public:
|
|||
}
|
||||
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(SOCK_SEQPACKET);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return protocol_;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return family_;
|
||||
}
|
||||
|
|
|
@ -75,19 +75,19 @@ public:
|
|||
}
|
||||
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(SOCK_STREAM);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return protocol_;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return family_;
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <boost/asio/detail/handler_invoke_helpers.hpp>
|
||||
#include <boost/asio/detail/handler_type_requirements.hpp>
|
||||
#include <boost/asio/detail/non_const_lvalue.hpp>
|
||||
#include <boost/asio/detail/type_traits.hpp>
|
||||
|
||||
#include <boost/asio/detail/push_options.hpp>
|
||||
|
||||
|
@ -141,26 +140,11 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename Stream>
|
||||
class initiate_async_buffered_fill
|
||||
struct initiate_async_buffered_fill
|
||||
{
|
||||
public:
|
||||
typedef typename remove_reference<
|
||||
Stream>::type::lowest_layer_type::executor_type executor_type;
|
||||
|
||||
explicit initiate_async_buffered_fill(Stream& next_layer)
|
||||
: next_layer_(next_layer)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return next_layer_.lowest_layer().get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler>
|
||||
template <typename ReadHandler, typename Stream>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
buffered_stream_storage* storage) const
|
||||
buffered_stream_storage* storage, Stream* next_layer) 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.
|
||||
|
@ -169,16 +153,13 @@ namespace detail
|
|||
non_const_lvalue<ReadHandler> handler2(handler);
|
||||
std::size_t previous_size = storage->size();
|
||||
storage->resize(storage->capacity());
|
||||
next_layer_.async_read_some(
|
||||
next_layer->async_read_some(
|
||||
buffer(
|
||||
storage->data() + previous_size,
|
||||
storage->size() - previous_size),
|
||||
buffered_fill_handler<typename decay<ReadHandler>::type>(
|
||||
*storage, previous_size, handler2.value));
|
||||
}
|
||||
|
||||
private:
|
||||
Stream& next_layer_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -213,18 +194,15 @@ struct associated_executor<
|
|||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename Stream>
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
buffered_read_stream<Stream>::async_fill(
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_buffered_fill<Stream>(next_layer_),
|
||||
handler, &storage_);
|
||||
detail::initiate_async_buffered_fill(), handler, &storage_, &next_layer_);
|
||||
}
|
||||
|
||||
template <typename Stream>
|
||||
|
@ -358,26 +336,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename Stream>
|
||||
class initiate_async_buffered_read_some
|
||||
struct initiate_async_buffered_read_some
|
||||
{
|
||||
public:
|
||||
typedef typename remove_reference<
|
||||
Stream>::type::lowest_layer_type::executor_type executor_type;
|
||||
|
||||
explicit initiate_async_buffered_read_some(Stream& next_layer)
|
||||
: next_layer_(next_layer)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return next_layer_.lowest_layer().get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
template <typename ReadHandler, typename Stream,
|
||||
typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
buffered_stream_storage* storage,
|
||||
buffered_stream_storage* storage, Stream* next_layer,
|
||||
const MutableBufferSequence& buffers) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -388,23 +352,20 @@ namespace detail
|
|||
non_const_lvalue<ReadHandler> handler2(handler);
|
||||
if (buffer_size(buffers) == 0 || !storage->empty())
|
||||
{
|
||||
next_layer_.async_read_some(BOOST_ASIO_MUTABLE_BUFFER(0, 0),
|
||||
next_layer->async_read_some(BOOST_ASIO_MUTABLE_BUFFER(0, 0),
|
||||
buffered_read_some_handler<MutableBufferSequence,
|
||||
typename decay<ReadHandler>::type>(
|
||||
*storage, buffers, handler2.value));
|
||||
}
|
||||
else
|
||||
{
|
||||
initiate_async_buffered_fill<Stream>(this->next_layer_)(
|
||||
initiate_async_buffered_fill()(
|
||||
buffered_read_some_handler<MutableBufferSequence,
|
||||
typename decay<ReadHandler>::type>(
|
||||
*storage, buffers, handler2.value),
|
||||
storage);
|
||||
storage, next_layer);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
Stream& next_layer_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -447,10 +408,8 @@ struct associated_executor<
|
|||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename Stream>
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
buffered_read_stream<Stream>::async_read_some(
|
||||
const MutableBufferSequence& buffers,
|
||||
|
@ -458,8 +417,8 @@ buffered_read_stream<Stream>::async_read_some(
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_buffered_read_some<Stream>(next_layer_),
|
||||
handler, &storage_, buffers);
|
||||
detail::initiate_async_buffered_read_some(),
|
||||
handler, &storage_, &next_layer_, buffers);
|
||||
}
|
||||
|
||||
template <typename Stream>
|
||||
|
|
|
@ -126,39 +126,21 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename Stream>
|
||||
class initiate_async_buffered_flush
|
||||
struct initiate_async_buffered_flush
|
||||
{
|
||||
public:
|
||||
typedef typename remove_reference<
|
||||
Stream>::type::lowest_layer_type::executor_type executor_type;
|
||||
|
||||
explicit initiate_async_buffered_flush(Stream& next_layer)
|
||||
: next_layer_(next_layer)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return next_layer_.lowest_layer().get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler>
|
||||
template <typename WriteHandler, typename Stream>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
buffered_stream_storage* storage) const
|
||||
buffered_stream_storage* storage, Stream* next_layer) 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.
|
||||
BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
|
||||
|
||||
non_const_lvalue<WriteHandler> handler2(handler);
|
||||
async_write(next_layer_, buffer(storage->data(), storage->size()),
|
||||
async_write(*next_layer, buffer(storage->data(), storage->size()),
|
||||
buffered_flush_handler<typename decay<WriteHandler>::type>(
|
||||
*storage, handler2.value));
|
||||
}
|
||||
|
||||
private:
|
||||
Stream& next_layer_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -193,18 +175,16 @@ struct associated_executor<
|
|||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename Stream>
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
buffered_write_stream<Stream>::async_flush(
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_buffered_flush<Stream>(next_layer_),
|
||||
handler, &storage_);
|
||||
detail::initiate_async_buffered_flush(),
|
||||
handler, &storage_, &next_layer_);
|
||||
}
|
||||
|
||||
template <typename Stream>
|
||||
|
@ -344,26 +324,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename Stream>
|
||||
class initiate_async_buffered_write_some
|
||||
struct initiate_async_buffered_write_some
|
||||
{
|
||||
public:
|
||||
typedef typename remove_reference<
|
||||
Stream>::type::lowest_layer_type::executor_type executor_type;
|
||||
|
||||
explicit initiate_async_buffered_write_some(Stream& next_layer)
|
||||
: next_layer_(next_layer)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return next_layer_.lowest_layer().get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
template <typename WriteHandler, typename Stream,
|
||||
typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
buffered_stream_storage* storage,
|
||||
buffered_stream_storage* storage, Stream* next_layer,
|
||||
const ConstBufferSequence& buffers) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -374,23 +340,20 @@ namespace detail
|
|||
non_const_lvalue<WriteHandler> handler2(handler);
|
||||
if (buffer_size(buffers) == 0 || storage->size() < storage->capacity())
|
||||
{
|
||||
next_layer_.async_write_some(BOOST_ASIO_CONST_BUFFER(0, 0),
|
||||
next_layer->async_write_some(BOOST_ASIO_CONST_BUFFER(0, 0),
|
||||
buffered_write_some_handler<ConstBufferSequence,
|
||||
typename decay<WriteHandler>::type>(
|
||||
*storage, buffers, handler2.value));
|
||||
}
|
||||
else
|
||||
{
|
||||
initiate_async_buffered_flush<Stream>(this->next_layer_)(
|
||||
initiate_async_buffered_flush()(
|
||||
buffered_write_some_handler<ConstBufferSequence,
|
||||
typename decay<WriteHandler>::type>(
|
||||
*storage, buffers, handler2.value),
|
||||
storage);
|
||||
storage, next_layer);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
Stream& next_layer_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -433,10 +396,8 @@ struct associated_executor<
|
|||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename Stream>
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
buffered_write_stream<Stream>::async_write_some(
|
||||
const ConstBufferSequence& buffers,
|
||||
|
@ -444,8 +405,8 @@ buffered_write_stream<Stream>::async_write_some(
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_buffered_write_some<Stream>(next_layer_),
|
||||
handler, &storage_, buffers);
|
||||
detail::initiate_async_buffered_write_some(),
|
||||
handler, &storage_, &next_layer_, buffers);
|
||||
}
|
||||
|
||||
template <typename Stream>
|
||||
|
|
|
@ -90,43 +90,25 @@ awaitable<void, Executor> co_spawn_entry_point(
|
|||
});
|
||||
}
|
||||
|
||||
template <typename Executor>
|
||||
class initiate_co_spawn
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return ex_;
|
||||
}
|
||||
|
||||
template <typename Handler, typename F>
|
||||
void operator()(Handler&& handler, F&& f) const
|
||||
template <typename Handler, typename Executor, typename F>
|
||||
void operator()(Handler&& handler, const Executor& ex, F&& f) const
|
||||
{
|
||||
typedef typename result_of<F()>::type awaitable_type;
|
||||
typedef typename awaitable_type::executor_type executor_type;
|
||||
|
||||
executor_type ex2(ex);
|
||||
auto a = (co_spawn_entry_point)(static_cast<awaitable_type*>(nullptr),
|
||||
ex_, std::forward<F>(f), std::forward<Handler>(handler));
|
||||
awaitable_handler<executor_type, void>(std::move(a), ex_).launch();
|
||||
ex2, std::forward<F>(f), std::forward<Handler>(handler));
|
||||
awaitable_handler<executor_type, void>(std::move(a), ex2).launch();
|
||||
}
|
||||
|
||||
private:
|
||||
Executor ex_;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename Executor, typename F,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(typename detail::awaitable_signature<
|
||||
typename result_of<F()>::type>::type) CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken,
|
||||
template <typename Executor, typename F, typename CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken,
|
||||
typename detail::awaitable_signature<typename result_of<F()>::type>::type)
|
||||
co_spawn(const Executor& ex, F&& f, CompletionToken&& token,
|
||||
typename enable_if<
|
||||
|
@ -135,15 +117,11 @@ co_spawn(const Executor& ex, F&& f, CompletionToken&& token,
|
|||
{
|
||||
return async_initiate<CompletionToken,
|
||||
typename detail::awaitable_signature<typename result_of<F()>::type>>(
|
||||
detail::initiate_co_spawn<
|
||||
typename result_of<F()>::type::executor_type>(ex),
|
||||
token, std::forward<F>(f));
|
||||
detail::initiate_co_spawn(), token, ex, std::forward<F>(f));
|
||||
}
|
||||
|
||||
template <typename ExecutionContext, typename F,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(typename detail::awaitable_signature<
|
||||
typename result_of<F()>::type>::type) CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken,
|
||||
template <typename ExecutionContext, typename F, typename CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken,
|
||||
typename detail::awaitable_signature<typename result_of<F()>::type>::type)
|
||||
co_spawn(ExecutionContext& ctx, F&& f, CompletionToken&& token,
|
||||
typename enable_if<
|
||||
|
|
|
@ -32,123 +32,13 @@ namespace asio {
|
|||
|
||||
namespace detail
|
||||
{
|
||||
template <typename>
|
||||
struct composed_io_executors;
|
||||
|
||||
template <>
|
||||
struct composed_io_executors<void()>
|
||||
{
|
||||
composed_io_executors() BOOST_ASIO_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) BOOST_ASIO_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);
|
||||
}
|
||||
|
||||
#if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
template <typename Head, typename... Tail>
|
||||
struct composed_io_executors<void(Head, Tail...)>
|
||||
{
|
||||
explicit composed_io_executors(const Head& head,
|
||||
const Tail&... tail) BOOST_ASIO_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...);
|
||||
}
|
||||
|
||||
#else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
#define BOOST_ASIO_PRIVATE_COMPOSED_IO_EXECUTORS_DEF(n) \
|
||||
template <typename Head, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
struct composed_io_executors<void(Head, BOOST_ASIO_VARIADIC_TARGS(n))> \
|
||||
{ \
|
||||
explicit composed_io_executors(const Head& head, \
|
||||
BOOST_ASIO_VARIADIC_CONSTREF_PARAMS(n)) BOOST_ASIO_NOEXCEPT \
|
||||
: head_(head), \
|
||||
tail_(BOOST_ASIO_VARIADIC_BYVAL_ARGS(n)) \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
void reset() \
|
||||
{ \
|
||||
head_.reset(); \
|
||||
tail_.reset(); \
|
||||
} \
|
||||
\
|
||||
typedef Head head_type; \
|
||||
Head head_; \
|
||||
composed_io_executors<void(BOOST_ASIO_VARIADIC_TARGS(n))> tail_; \
|
||||
}; \
|
||||
\
|
||||
template <typename Head, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
inline composed_io_executors<void(Head, BOOST_ASIO_VARIADIC_TARGS(n))> \
|
||||
make_composed_io_executors(const Head& head, \
|
||||
BOOST_ASIO_VARIADIC_CONSTREF_PARAMS(n)) \
|
||||
{ \
|
||||
return composed_io_executors< \
|
||||
void(Head, BOOST_ASIO_VARIADIC_TARGS(n))>( \
|
||||
head, BOOST_ASIO_VARIADIC_BYVAL_ARGS(n)); \
|
||||
} \
|
||||
/**/
|
||||
BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_COMPOSED_IO_EXECUTORS_DEF)
|
||||
#undef BOOST_ASIO_PRIVATE_COMPOSED_IO_EXECUTORS_DEF
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
template <typename>
|
||||
struct composed_work;
|
||||
|
||||
template <>
|
||||
struct composed_work<void()>
|
||||
{
|
||||
typedef composed_io_executors<void()> executors_type;
|
||||
|
||||
composed_work(const executors_type&) BOOST_ASIO_NOEXCEPT
|
||||
composed_work() BOOST_ASIO_NOEXCEPT
|
||||
: head_(system_executor())
|
||||
{
|
||||
}
|
||||
|
@ -162,13 +52,16 @@ namespace detail
|
|||
executor_work_guard<system_executor> head_;
|
||||
};
|
||||
|
||||
inline composed_work<void()> make_composed_work()
|
||||
{
|
||||
return composed_work<void()>();
|
||||
}
|
||||
|
||||
template <typename Head>
|
||||
struct composed_work<void(Head)>
|
||||
{
|
||||
typedef composed_io_executors<void(Head)> executors_type;
|
||||
|
||||
explicit composed_work(const executors_type& ex) BOOST_ASIO_NOEXCEPT
|
||||
: head_(ex.head_)
|
||||
explicit composed_work(const Head& ex) BOOST_ASIO_NOEXCEPT
|
||||
: head_(ex)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -181,16 +74,21 @@ namespace detail
|
|||
executor_work_guard<Head> head_;
|
||||
};
|
||||
|
||||
template <typename Head>
|
||||
inline composed_work<void(Head)> make_composed_work(const Head& head)
|
||||
{
|
||||
return composed_work<void(Head)>(head);
|
||||
}
|
||||
|
||||
#if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
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) BOOST_ASIO_NOEXCEPT
|
||||
: head_(ex.head_),
|
||||
tail_(ex.tail_)
|
||||
explicit composed_work(const Head& head,
|
||||
const Tail&... tail) BOOST_ASIO_NOEXCEPT
|
||||
: head_(head),
|
||||
tail_(tail...)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -205,18 +103,23 @@ namespace detail
|
|||
composed_work<void(Tail...)> tail_;
|
||||
};
|
||||
|
||||
template <typename Head, typename... Tail>
|
||||
inline composed_work<void(Head, Tail...)>
|
||||
make_composed_work(const Head& head, const Tail&... tail)
|
||||
{
|
||||
return composed_work<void(Head, Tail...)>(head, tail...);
|
||||
}
|
||||
|
||||
#else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
#define BOOST_ASIO_PRIVATE_COMPOSED_WORK_DEF(n) \
|
||||
template <typename Head, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
struct composed_work<void(Head, BOOST_ASIO_VARIADIC_TARGS(n))> \
|
||||
{ \
|
||||
typedef composed_io_executors<void(Head, \
|
||||
BOOST_ASIO_VARIADIC_TARGS(n))> executors_type; \
|
||||
\
|
||||
explicit composed_work(const executors_type& ex) BOOST_ASIO_NOEXCEPT \
|
||||
: head_(ex.head_), \
|
||||
tail_(ex.tail_) \
|
||||
explicit composed_work(const Head& head, \
|
||||
BOOST_ASIO_VARIADIC_CONSTREF_PARAMS(n)) BOOST_ASIO_NOEXCEPT \
|
||||
: head_(head), \
|
||||
tail_(BOOST_ASIO_VARIADIC_BYVAL_ARGS(n)) \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
|
@ -230,6 +133,15 @@ namespace detail
|
|||
executor_work_guard<Head> head_; \
|
||||
composed_work<void(BOOST_ASIO_VARIADIC_TARGS(n))> tail_; \
|
||||
}; \
|
||||
\
|
||||
template <typename Head, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
inline composed_work<void(Head, BOOST_ASIO_VARIADIC_TARGS(n))> \
|
||||
make_composed_work(const Head& head, BOOST_ASIO_VARIADIC_CONSTREF_PARAMS(n)) \
|
||||
{ \
|
||||
return composed_work< \
|
||||
void(Head, BOOST_ASIO_VARIADIC_TARGS(n))>( \
|
||||
head, BOOST_ASIO_VARIADIC_BYVAL_ARGS(n)); \
|
||||
} \
|
||||
/**/
|
||||
BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_COMPOSED_WORK_DEF)
|
||||
#undef BOOST_ASIO_PRIVATE_COMPOSED_WORK_DEF
|
||||
|
@ -387,46 +299,21 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename Signature, typename Executors>
|
||||
class initiate_composed_op
|
||||
template <typename Signature>
|
||||
struct initiate_composed_op
|
||||
{
|
||||
public:
|
||||
typedef typename composed_io_executors<Executors>::head_type executor_type;
|
||||
|
||||
template <typename T>
|
||||
explicit initiate_composed_op(BOOST_ASIO_MOVE_ARG(T) executors)
|
||||
: executors_(BOOST_ASIO_MOVE_CAST(T)(executors))
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return executors_.head_;
|
||||
}
|
||||
|
||||
template <typename Handler, typename Impl>
|
||||
template <typename Handler, typename Impl, typename Work>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(Handler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(Impl) impl) const
|
||||
BOOST_ASIO_MOVE_ARG(Impl) impl,
|
||||
BOOST_ASIO_MOVE_ARG(Work) work) const
|
||||
{
|
||||
composed_op<typename decay<Impl>::type, composed_work<Executors>,
|
||||
composed_op<typename decay<Impl>::type, typename decay<Work>::type,
|
||||
typename decay<Handler>::type, Signature>(
|
||||
BOOST_ASIO_MOVE_CAST(Impl)(impl),
|
||||
composed_work<Executors>(executors_),
|
||||
BOOST_ASIO_MOVE_CAST(Impl)(impl), BOOST_ASIO_MOVE_CAST(Work)(work),
|
||||
BOOST_ASIO_MOVE_CAST(Handler)(handler))();
|
||||
}
|
||||
|
||||
private:
|
||||
composed_io_executors<Executors> executors_;
|
||||
};
|
||||
|
||||
template <typename Signature, typename Executors>
|
||||
inline initiate_composed_op<Signature, Executors> make_initiate_composed_op(
|
||||
BOOST_ASIO_MOVE_ARG(composed_io_executors<Executors>) executors)
|
||||
{
|
||||
return initiate_composed_op<Signature, Executors>(
|
||||
BOOST_ASIO_MOVE_CAST(composed_io_executors<Executors>)(executors));
|
||||
}
|
||||
|
||||
template <typename IoObject>
|
||||
inline typename IoObject::executor_type
|
||||
get_composed_io_executor(IoObject& io_object)
|
||||
|
@ -447,31 +334,31 @@ namespace detail
|
|||
|
||||
template <typename CompletionToken, typename Signature,
|
||||
typename Implementation, typename... IoObjectsOrExecutors>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, Signature)
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)
|
||||
async_compose(BOOST_ASIO_MOVE_ARG(Implementation) implementation,
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token,
|
||||
BOOST_ASIO_MOVE_ARG(IoObjectsOrExecutors)... io_objects_or_executors)
|
||||
{
|
||||
return async_initiate<CompletionToken, Signature>(
|
||||
detail::make_initiate_composed_op<Signature>(
|
||||
detail::make_composed_io_executors(
|
||||
detail::get_composed_io_executor(
|
||||
BOOST_ASIO_MOVE_CAST(IoObjectsOrExecutors)(
|
||||
io_objects_or_executors))...)),
|
||||
token, BOOST_ASIO_MOVE_CAST(Implementation)(implementation));
|
||||
detail::initiate_composed_op<Signature>(), token,
|
||||
BOOST_ASIO_MOVE_CAST(Implementation)(implementation),
|
||||
detail::make_composed_work(
|
||||
detail::get_composed_io_executor(
|
||||
BOOST_ASIO_MOVE_CAST(IoObjectsOrExecutors)(
|
||||
io_objects_or_executors))...));
|
||||
}
|
||||
|
||||
#else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
|
||||
|
||||
template <typename CompletionToken, typename Signature, typename Implementation>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, Signature)
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature)
|
||||
async_compose(BOOST_ASIO_MOVE_ARG(Implementation) implementation,
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token)
|
||||
{
|
||||
return async_initiate<CompletionToken, Signature>(
|
||||
detail::make_initiate_composed_op<Signature>(
|
||||
detail::make_composed_io_executors()),
|
||||
token, BOOST_ASIO_MOVE_CAST(Implementation)(implementation));
|
||||
detail::initiate_composed_op<Signature>(), token,
|
||||
BOOST_ASIO_MOVE_CAST(Implementation)(implementation),
|
||||
detail::make_composed_work());
|
||||
}
|
||||
|
||||
# define BOOST_ASIO_PRIVATE_GET_COMPOSED_IO_EXECUTOR(n) \
|
||||
|
@ -501,16 +388,16 @@ async_compose(BOOST_ASIO_MOVE_ARG(Implementation) implementation,
|
|||
#define BOOST_ASIO_PRIVATE_ASYNC_COMPOSE_DEF(n) \
|
||||
template <typename CompletionToken, typename Signature, \
|
||||
typename Implementation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, Signature) \
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signature) \
|
||||
async_compose(BOOST_ASIO_MOVE_ARG(Implementation) implementation, \
|
||||
BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
|
||||
BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
|
||||
{ \
|
||||
return async_initiate<CompletionToken, Signature>( \
|
||||
detail::make_initiate_composed_op<Signature>( \
|
||||
detail::make_composed_io_executors( \
|
||||
BOOST_ASIO_PRIVATE_GET_COMPOSED_IO_EXECUTOR(n))), \
|
||||
token, BOOST_ASIO_MOVE_CAST(Implementation)(implementation)); \
|
||||
detail::initiate_composed_op<Signature>(), token, \
|
||||
BOOST_ASIO_MOVE_CAST(Implementation)(implementation), \
|
||||
detail::make_composed_work( \
|
||||
BOOST_ASIO_PRIVATE_GET_COMPOSED_IO_EXECUTOR(n))); \
|
||||
} \
|
||||
/**/
|
||||
BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_ASYNC_COMPOSE_DEF)
|
||||
|
|
|
@ -455,26 +455,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename Protocol, typename Executor>
|
||||
class initiate_async_range_connect
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return socket_.get_executor();
|
||||
}
|
||||
|
||||
template <typename RangeConnectHandler,
|
||||
typename EndpointSequence, typename ConnectCondition>
|
||||
template <typename RangeConnectHandler, typename Protocol,
|
||||
typename Executor, typename EndpointSequence, typename ConnectCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler,
|
||||
const EndpointSequence& endpoints,
|
||||
basic_socket<Protocol, Executor>* s, const EndpointSequence& endpoints,
|
||||
const ConnectCondition& connect_condition) const
|
||||
{
|
||||
// If you get an error on the following line it means that your
|
||||
|
@ -485,12 +471,9 @@ namespace detail
|
|||
|
||||
non_const_lvalue<RangeConnectHandler> handler2(handler);
|
||||
range_connect_op<Protocol, Executor, EndpointSequence, ConnectCondition,
|
||||
typename decay<RangeConnectHandler>::type>(socket_, endpoints,
|
||||
typename decay<RangeConnectHandler>::type>(*s, endpoints,
|
||||
connect_condition, handler2.value)(boost::system::error_code(), 1);
|
||||
}
|
||||
|
||||
private:
|
||||
basic_socket<Protocol, Executor>& socket_;
|
||||
};
|
||||
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
|
@ -641,28 +624,13 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename Protocol, typename Executor>
|
||||
class initiate_async_iterator_connect
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return socket_.get_executor();
|
||||
}
|
||||
|
||||
template <typename IteratorConnectHandler,
|
||||
typename Iterator, typename ConnectCondition>
|
||||
template <typename IteratorConnectHandler, typename Protocol,
|
||||
typename Executor, typename Iterator, typename ConnectCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler,
|
||||
Iterator begin, Iterator end,
|
||||
const ConnectCondition& connect_condition) const
|
||||
basic_socket<Protocol, Executor>* s, 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
|
||||
|
@ -672,12 +640,9 @@ namespace detail
|
|||
|
||||
non_const_lvalue<IteratorConnectHandler> handler2(handler);
|
||||
iterator_connect_op<Protocol, Executor, Iterator, ConnectCondition,
|
||||
typename decay<IteratorConnectHandler>::type>(socket_, begin, end,
|
||||
typename decay<IteratorConnectHandler>::type>(*s, begin, end,
|
||||
connect_condition, handler2.value)(boost::system::error_code(), 1);
|
||||
}
|
||||
|
||||
private:
|
||||
basic_socket<Protocol, Executor>& socket_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -765,10 +730,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename Protocol, typename Executor, typename EndpointSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::endpoint)) RangeConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(RangeConnectHandler,
|
||||
template <typename Protocol, typename Executor,
|
||||
typename EndpointSequence, typename RangeConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
|
||||
void (boost::system::error_code, typename Protocol::endpoint))
|
||||
async_connect(basic_socket<Protocol, Executor>& s,
|
||||
const EndpointSequence& endpoints,
|
||||
|
@ -778,15 +742,14 @@ async_connect(basic_socket<Protocol, Executor>& s,
|
|||
{
|
||||
return async_initiate<RangeConnectHandler,
|
||||
void (boost::system::error_code, typename Protocol::endpoint)>(
|
||||
detail::initiate_async_range_connect<Protocol, Executor>(s),
|
||||
handler, endpoints, detail::default_connect_condition());
|
||||
detail::initiate_async_range_connect(), handler,
|
||||
&s, endpoints, detail::default_connect_condition());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_DEPRECATED)
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
Iterator)) IteratorConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
|
||||
template <typename Protocol, typename Executor,
|
||||
typename Iterator, typename IteratorConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator))
|
||||
async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler,
|
||||
|
@ -794,30 +757,27 @@ async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
|||
{
|
||||
return async_initiate<IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator)>(
|
||||
detail::initiate_async_iterator_connect<Protocol, Executor>(s),
|
||||
handler, begin, Iterator(), detail::default_connect_condition());
|
||||
detail::initiate_async_iterator_connect(), handler,
|
||||
&s, begin, Iterator(), detail::default_connect_condition());
|
||||
}
|
||||
#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
|
||||
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
Iterator)) IteratorConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
|
||||
template <typename Protocol, typename Executor,
|
||||
typename Iterator, typename IteratorConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator))
|
||||
async_connect(basic_socket<Protocol, Executor>& s, Iterator begin, Iterator end,
|
||||
BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler)
|
||||
{
|
||||
return async_initiate<IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator)>(
|
||||
detail::initiate_async_iterator_connect<Protocol, Executor>(s),
|
||||
handler, begin, end, detail::default_connect_condition());
|
||||
detail::initiate_async_iterator_connect(), handler,
|
||||
&s, begin, end, detail::default_connect_condition());
|
||||
}
|
||||
|
||||
template <typename Protocol, typename Executor,
|
||||
typename EndpointSequence, typename ConnectCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
typename Protocol::endpoint)) RangeConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(RangeConnectHandler,
|
||||
template <typename Protocol, typename Executor, typename EndpointSequence,
|
||||
typename ConnectCondition, typename RangeConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
|
||||
void (boost::system::error_code, typename Protocol::endpoint))
|
||||
async_connect(basic_socket<Protocol, Executor>& s,
|
||||
const EndpointSequence& endpoints, ConnectCondition connect_condition,
|
||||
|
@ -827,16 +787,14 @@ async_connect(basic_socket<Protocol, Executor>& s,
|
|||
{
|
||||
return async_initiate<RangeConnectHandler,
|
||||
void (boost::system::error_code, typename Protocol::endpoint)>(
|
||||
detail::initiate_async_range_connect<Protocol, Executor>(s),
|
||||
handler, endpoints, connect_condition);
|
||||
detail::initiate_async_range_connect(),
|
||||
handler, &s, endpoints, connect_condition);
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_DEPRECATED)
|
||||
template <typename Protocol, typename Executor,
|
||||
typename Iterator, typename ConnectCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
Iterator)) IteratorConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
typename ConnectCondition, typename IteratorConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator))
|
||||
async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
||||
ConnectCondition connect_condition,
|
||||
|
@ -845,16 +803,14 @@ async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
|||
{
|
||||
return async_initiate<IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator)>(
|
||||
detail::initiate_async_iterator_connect<Protocol, Executor>(s),
|
||||
handler, begin, Iterator(), connect_condition);
|
||||
detail::initiate_async_iterator_connect(),
|
||||
handler, &s, begin, Iterator(), connect_condition);
|
||||
}
|
||||
#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
|
||||
|
||||
template <typename Protocol, typename Executor,
|
||||
typename Iterator, typename ConnectCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
Iterator)) IteratorConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
|
||||
template <typename Protocol, typename Executor, typename Iterator,
|
||||
typename ConnectCondition, typename IteratorConnectHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator))
|
||||
async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
||||
Iterator end, ConnectCondition connect_condition,
|
||||
|
@ -862,8 +818,8 @@ async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
|
|||
{
|
||||
return async_initiate<IteratorConnectHandler,
|
||||
void (boost::system::error_code, Iterator)>(
|
||||
detail::initiate_async_iterator_connect<Protocol, Executor>(s),
|
||||
handler, begin, end, connect_condition);
|
||||
detail::initiate_async_iterator_connect(),
|
||||
handler, &s, begin, end, connect_condition);
|
||||
}
|
||||
|
||||
} // namespace asio
|
||||
|
|
|
@ -26,9 +26,8 @@ namespace boost {
|
|||
namespace asio {
|
||||
namespace detail {
|
||||
|
||||
class initiate_defer
|
||||
struct initiate_defer
|
||||
{
|
||||
public:
|
||||
template <typename CompletionHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) const
|
||||
{
|
||||
|
@ -42,63 +41,42 @@ public:
|
|||
|
||||
ex.defer(BOOST_ASIO_MOVE_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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return ex_;
|
||||
}
|
||||
|
||||
template <typename CompletionHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) const
|
||||
template <typename CompletionHandler, typename Executor>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(Executor) ex) const
|
||||
{
|
||||
typedef typename decay<CompletionHandler>::type DecayedHandler;
|
||||
|
||||
typename associated_allocator<DecayedHandler>::type alloc(
|
||||
(get_associated_allocator)(handler));
|
||||
|
||||
ex_.defer(detail::work_dispatcher<DecayedHandler>(
|
||||
ex.defer(detail::work_dispatcher<DecayedHandler>(
|
||||
BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler)), alloc);
|
||||
}
|
||||
|
||||
private:
|
||||
Executor ex_;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
template <typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token)
|
||||
{
|
||||
return async_initiate<CompletionToken, void()>(
|
||||
detail::initiate_defer(), token);
|
||||
}
|
||||
|
||||
template <typename Executor,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
template <typename Executor, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
const Executor& ex, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_executor<Executor>::value>::type*)
|
||||
{
|
||||
return async_initiate<CompletionToken, void()>(
|
||||
detail::initiate_defer_with_executor<Executor>(ex), token);
|
||||
detail::initiate_defer(), token, ex);
|
||||
}
|
||||
|
||||
template <typename ExecutionContext,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
template <typename ExecutionContext, typename CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer(
|
||||
ExecutionContext& ctx, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_convertible<
|
||||
ExecutionContext&, execution_context&>::value>::type*)
|
||||
|
|
|
@ -26,9 +26,8 @@ namespace boost {
|
|||
namespace asio {
|
||||
namespace detail {
|
||||
|
||||
class initiate_dispatch
|
||||
struct initiate_dispatch
|
||||
{
|
||||
public:
|
||||
template <typename CompletionHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) const
|
||||
{
|
||||
|
@ -42,63 +41,42 @@ public:
|
|||
|
||||
ex.dispatch(BOOST_ASIO_MOVE_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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return ex_;
|
||||
}
|
||||
|
||||
template <typename CompletionHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) const
|
||||
template <typename CompletionHandler, typename Executor>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(Executor) ex) const
|
||||
{
|
||||
typedef typename decay<CompletionHandler>::type DecayedHandler;
|
||||
|
||||
typename associated_allocator<DecayedHandler>::type alloc(
|
||||
(get_associated_allocator)(handler));
|
||||
|
||||
ex_.dispatch(detail::work_dispatcher<DecayedHandler>(
|
||||
ex.dispatch(detail::work_dispatcher<DecayedHandler>(
|
||||
BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler)), alloc);
|
||||
}
|
||||
|
||||
private:
|
||||
Executor ex_;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
template <typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token)
|
||||
{
|
||||
return async_initiate<CompletionToken, void()>(
|
||||
detail::initiate_dispatch(), token);
|
||||
}
|
||||
|
||||
template <typename Executor,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
template <typename Executor, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
const Executor& ex, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_executor<Executor>::value>::type*)
|
||||
{
|
||||
return async_initiate<CompletionToken, void()>(
|
||||
detail::initiate_dispatch_with_executor<Executor>(ex), token);
|
||||
detail::initiate_dispatch(), token, ex);
|
||||
}
|
||||
|
||||
template <typename ExecutionContext,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
template <typename ExecutionContext, typename CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch(
|
||||
ExecutionContext& ctx, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_convertible<
|
||||
ExecutionContext&, execution_context&>::value>::type*)
|
||||
|
|
|
@ -172,7 +172,7 @@ struct io_context::initiate_dispatch
|
|||
};
|
||||
|
||||
template <typename LegacyCompletionHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
io_context::dispatch(BOOST_ASIO_MOVE_ARG(LegacyCompletionHandler) handler)
|
||||
{
|
||||
return async_initiate<LegacyCompletionHandler, void ()>(
|
||||
|
@ -211,7 +211,7 @@ struct io_context::initiate_post
|
|||
};
|
||||
|
||||
template <typename LegacyCompletionHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
io_context::post(BOOST_ASIO_MOVE_ARG(LegacyCompletionHandler) handler)
|
||||
{
|
||||
return async_initiate<LegacyCompletionHandler, void ()>(
|
||||
|
|
|
@ -26,9 +26,8 @@ namespace boost {
|
|||
namespace asio {
|
||||
namespace detail {
|
||||
|
||||
class initiate_post
|
||||
struct initiate_post
|
||||
{
|
||||
public:
|
||||
template <typename CompletionHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) const
|
||||
{
|
||||
|
@ -42,63 +41,42 @@ public:
|
|||
|
||||
ex.post(BOOST_ASIO_MOVE_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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return ex_;
|
||||
}
|
||||
|
||||
template <typename CompletionHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler) const
|
||||
template <typename CompletionHandler, typename Executor>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(Executor) ex) const
|
||||
{
|
||||
typedef typename decay<CompletionHandler>::type DecayedHandler;
|
||||
|
||||
typename associated_allocator<DecayedHandler>::type alloc(
|
||||
(get_associated_allocator)(handler));
|
||||
|
||||
ex_.post(detail::work_dispatcher<DecayedHandler>(
|
||||
ex.post(detail::work_dispatcher<DecayedHandler>(
|
||||
BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler)), alloc);
|
||||
}
|
||||
|
||||
private:
|
||||
Executor ex_;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) post(
|
||||
template <typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token)
|
||||
{
|
||||
return async_initiate<CompletionToken, void()>(
|
||||
detail::initiate_post(), token);
|
||||
}
|
||||
|
||||
template <typename Executor,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) post(
|
||||
template <typename Executor, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
|
||||
const Executor& ex, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_executor<Executor>::value>::type*)
|
||||
{
|
||||
return async_initiate<CompletionToken, void()>(
|
||||
detail::initiate_post_with_executor<Executor>(ex), token);
|
||||
detail::initiate_post(), token, ex);
|
||||
}
|
||||
|
||||
template <typename ExecutionContext,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) post(
|
||||
template <typename ExecutionContext, typename CompletionToken>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
|
||||
ExecutionContext& ctx, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_convertible<
|
||||
ExecutionContext&, execution_context&>::value>::type*)
|
||||
|
|
|
@ -453,26 +453,12 @@ namespace detail
|
|||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_buffer_sequence
|
||||
struct initiate_async_read_buffer_sequence
|
||||
{
|
||||
public:
|
||||
typedef typename AsyncReadStream::executor_type executor_type;
|
||||
|
||||
explicit initiate_async_read_buffer_sequence(AsyncReadStream& stream)
|
||||
: stream_(stream)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence,
|
||||
typename CompletionCondition>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename MutableBufferSequence, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
const MutableBufferSequence& buffers,
|
||||
AsyncReadStream* s, const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -481,13 +467,10 @@ namespace detail
|
|||
|
||||
non_const_lvalue<ReadHandler> handler2(handler);
|
||||
non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
|
||||
start_read_buffer_sequence_op(stream_, buffers,
|
||||
start_read_buffer_sequence_op(*s, buffers,
|
||||
boost::asio::buffer_sequence_begin(buffers),
|
||||
completion_cond2.value, handler2.value);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -533,11 +516,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream,
|
||||
typename MutableBufferSequence, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename MutableBufferSequence,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
|
||||
CompletionCondition completion_condition,
|
||||
|
@ -548,14 +529,13 @@ async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_buffer_sequence<AsyncReadStream>(s), handler,
|
||||
buffers, BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
detail::initiate_async_read_buffer_sequence(), handler, &s, buffers,
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream, typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
|
@ -565,8 +545,8 @@ async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_buffer_sequence<AsyncReadStream>(s),
|
||||
handler, buffers, transfer_all());
|
||||
detail::initiate_async_read_buffer_sequence(),
|
||||
handler, &s, buffers, transfer_all());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_DYNAMIC_BUFFER_V1)
|
||||
|
@ -712,26 +692,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_dynbuf_v1
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename DynamicBuffer_v1,
|
||||
typename CompletionCondition>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -742,13 +708,10 @@ namespace detail
|
|||
non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
|
||||
read_dynbuf_v1_op<AsyncReadStream, typename decay<DynamicBuffer_v1>::type,
|
||||
CompletionCondition, typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
completion_cond2.value, handler2.value)(
|
||||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -792,10 +755,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -810,11 +772,9 @@ async_read(AsyncReadStream& s,
|
|||
transfer_all(), BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -831,18 +791,16 @@ async_read(AsyncReadStream& s,
|
|||
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_dynbuf_v1<AsyncReadStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
detail::initiate_async_read_dynbuf_v1(), handler, &s,
|
||||
BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
#if !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
|
@ -851,11 +809,9 @@ async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
|
|||
BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream,
|
||||
typename Allocator, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
|
||||
CompletionCondition completion_condition,
|
||||
|
@ -1017,26 +973,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_dynbuf_v2
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename DynamicBuffer_v2,
|
||||
typename CompletionCondition>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1047,13 +989,10 @@ namespace detail
|
|||
non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
|
||||
read_dynbuf_v2_op<AsyncReadStream, typename decay<DynamicBuffer_v2>::type,
|
||||
CompletionCondition, typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
completion_cond2.value, handler2.value)(
|
||||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -1097,10 +1036,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
|
@ -1113,11 +1051,9 @@ async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
transfer_all(), BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
CompletionCondition completion_condition,
|
||||
|
@ -1132,8 +1068,8 @@ async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_dynbuf_v2<AsyncReadStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
detail::initiate_async_read_dynbuf_v2(), handler, &s,
|
||||
BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
|
|
|
@ -321,27 +321,13 @@ namespace detail
|
|||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
template <typename AsyncRandomAccessReadDevice>
|
||||
class initiate_async_read_at_buffer_sequence
|
||||
struct initiate_async_read_at_buffer_sequence
|
||||
{
|
||||
public:
|
||||
typedef typename AsyncRandomAccessReadDevice::executor_type executor_type;
|
||||
|
||||
explicit initiate_async_read_at_buffer_sequence(
|
||||
AsyncRandomAccessReadDevice& device)
|
||||
: device_(device)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return device_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence,
|
||||
typename CompletionCondition>
|
||||
template <typename ReadHandler, typename AsyncRandomAccessReadDevice,
|
||||
typename MutableBufferSequence, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
uint64_t offset, const MutableBufferSequence& buffers,
|
||||
AsyncRandomAccessReadDevice* d, uint64_t offset,
|
||||
const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -350,13 +336,10 @@ namespace detail
|
|||
|
||||
non_const_lvalue<ReadHandler> handler2(handler);
|
||||
non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
|
||||
start_read_at_buffer_sequence_op(device_, offset, buffers,
|
||||
start_read_at_buffer_sequence_op(*d, offset, buffers,
|
||||
boost::asio::buffer_sequence_begin(buffers),
|
||||
completion_cond2.value, handler2.value);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncRandomAccessReadDevice& device_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -404,11 +387,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncRandomAccessReadDevice,
|
||||
typename MutableBufferSequence, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_at(AsyncRandomAccessReadDevice& d,
|
||||
uint64_t offset, const MutableBufferSequence& buffers,
|
||||
|
@ -417,16 +398,13 @@ async_read_at(AsyncRandomAccessReadDevice& d,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_at_buffer_sequence<
|
||||
AsyncRandomAccessReadDevice>(d),
|
||||
handler, offset, buffers,
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
detail::initiate_async_read_at_buffer_sequence(), handler, &d, offset,
|
||||
buffers, BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_at(AsyncRandomAccessReadDevice& d,
|
||||
uint64_t offset, const MutableBufferSequence& buffers,
|
||||
|
@ -434,9 +412,8 @@ async_read_at(AsyncRandomAccessReadDevice& d,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_at_buffer_sequence<
|
||||
AsyncRandomAccessReadDevice>(d),
|
||||
handler, offset, buffers, transfer_all());
|
||||
detail::initiate_async_read_at_buffer_sequence(),
|
||||
handler, &d, offset, buffers, transfer_all());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
|
@ -577,27 +554,13 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncRandomAccessReadDevice>
|
||||
class initiate_async_read_at_streambuf
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return device_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler,
|
||||
template <typename ReadHandler, typename AsyncRandomAccessReadDevice,
|
||||
typename Allocator, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
uint64_t offset, basic_streambuf<Allocator>* b,
|
||||
AsyncRandomAccessReadDevice* d, uint64_t offset,
|
||||
basic_streambuf<Allocator>* b,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -608,12 +571,9 @@ namespace detail
|
|||
non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
|
||||
read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
|
||||
CompletionCondition, typename decay<ReadHandler>::type>(
|
||||
device_, offset, *b, completion_cond2.value, handler2.value)(
|
||||
*d, offset, *b, completion_cond2.value, handler2.value)(
|
||||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncRandomAccessReadDevice& device_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -657,11 +617,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncRandomAccessReadDevice,
|
||||
typename Allocator, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncRandomAccessReadDevice, typename Allocator,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_at(AsyncRandomAccessReadDevice& d,
|
||||
uint64_t offset, boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -670,15 +628,13 @@ async_read_at(AsyncRandomAccessReadDevice& d,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_at_streambuf<AsyncRandomAccessReadDevice>(d),
|
||||
handler, offset, &b,
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
detail::initiate_async_read_at_streambuf(), handler, &d, offset,
|
||||
&b, BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
template <typename AsyncRandomAccessReadDevice, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_at(AsyncRandomAccessReadDevice& d,
|
||||
uint64_t offset, boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -686,8 +642,8 @@ async_read_at(AsyncRandomAccessReadDevice& d,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_at_streambuf<AsyncRandomAccessReadDevice>(d),
|
||||
handler, offset, &b, transfer_all());
|
||||
detail::initiate_async_read_at_streambuf(),
|
||||
handler, &d, offset, &b, transfer_all());
|
||||
}
|
||||
|
||||
#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
|
|
|
@ -952,25 +952,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_until_delim_v1
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename DynamicBuffer_v1>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
char delim) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -981,12 +968,9 @@ namespace detail
|
|||
read_until_delim_op_v1<AsyncReadStream,
|
||||
typename decay<DynamicBuffer_v1>::type,
|
||||
typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
delim, handler2.value)(boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -1030,10 +1014,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -1045,8 +1028,8 @@ async_read_until(AsyncReadStream& s,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_until_delim_v1<AsyncReadStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers), delim);
|
||||
detail::initiate_async_read_until_delim_v1(), handler,
|
||||
&s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers), delim);
|
||||
}
|
||||
|
||||
namespace detail
|
||||
|
@ -1236,25 +1219,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_until_delim_string_v1
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename DynamicBuffer_v1>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
const std::string& delim) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1265,12 +1235,9 @@ namespace detail
|
|||
read_until_delim_string_op_v1<AsyncReadStream,
|
||||
typename decay<DynamicBuffer_v1>::type,
|
||||
typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
delim, handler2.value)(boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -1314,10 +1281,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -1330,8 +1296,8 @@ async_read_until(AsyncReadStream& s,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_until_delim_string_v1<AsyncReadStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
detail::initiate_async_read_until_delim_string_v1(),
|
||||
handler, &s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
static_cast<std::string>(delim));
|
||||
}
|
||||
|
||||
|
@ -1528,25 +1494,13 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_until_expr_v1
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename DynamicBuffer_v1, typename RegEx>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename RegEx>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers, const RegEx& expr) const
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(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.
|
||||
|
@ -1556,12 +1510,9 @@ namespace detail
|
|||
read_until_expr_op_v1<AsyncReadStream,
|
||||
typename decay<DynamicBuffer_v1>::type,
|
||||
RegEx, typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
expr, handler2.value)(boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -1605,10 +1556,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -1621,8 +1571,8 @@ async_read_until(AsyncReadStream& s,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_until_expr_v1<AsyncReadStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers), expr);
|
||||
detail::initiate_async_read_until_expr_v1(), handler,
|
||||
&s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers), expr);
|
||||
}
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_BOOST_REGEX)
|
||||
|
@ -1815,26 +1765,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_until_match_v1
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler,
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename MatchCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
MatchCondition match_condition) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -1845,12 +1781,9 @@ namespace detail
|
|||
read_until_match_op_v1<AsyncReadStream,
|
||||
typename decay<DynamicBuffer_v1>::type,
|
||||
MatchCondition, typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
match_condition, handler2.value)(boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -1894,11 +1827,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename MatchCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
typename MatchCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -1911,16 +1842,14 @@ async_read_until(AsyncReadStream& s,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_until_match_v1<AsyncReadStream>(s), handler,
|
||||
BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers), match_condition);
|
||||
detail::initiate_async_read_until_match_v1(), handler,
|
||||
&s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers), match_condition);
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -1930,10 +1859,8 @@ async_read_until(AsyncReadStream& s,
|
|||
delim, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -1946,10 +1873,8 @@ async_read_until(AsyncReadStream& s,
|
|||
|
||||
#if defined(BOOST_ASIO_HAS_BOOST_REGEX)
|
||||
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b, const boost::regex& expr,
|
||||
|
@ -1961,10 +1886,9 @@ async_read_until(AsyncReadStream& s,
|
|||
|
||||
#endif // defined(BOOST_ASIO_HAS_BOOST_REGEX)
|
||||
|
||||
template <typename AsyncReadStream, typename Allocator, typename MatchCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
typename MatchCondition, typename ReadHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -2163,25 +2087,13 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_until_delim_v2
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename DynamicBuffer_v2>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers, char delim) const
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(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.
|
||||
|
@ -2191,12 +2103,9 @@ namespace detail
|
|||
read_until_delim_op_v2<AsyncReadStream,
|
||||
typename decay<DynamicBuffer_v2>::type,
|
||||
typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
delim, handler2.value)(boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -2240,10 +2149,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
char delim, BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
|
@ -2253,8 +2161,8 @@ async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_until_delim_v2<AsyncReadStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers), delim);
|
||||
detail::initiate_async_read_until_delim_v2(), handler,
|
||||
&s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers), delim);
|
||||
}
|
||||
|
||||
namespace detail
|
||||
|
@ -2452,25 +2360,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_until_delim_string_v2
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename DynamicBuffer_v2>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
const std::string& delim) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -2481,12 +2376,9 @@ namespace detail
|
|||
read_until_delim_string_op_v2<AsyncReadStream,
|
||||
typename decay<DynamicBuffer_v2>::type,
|
||||
typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
delim, handler2.value)(boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -2531,10 +2423,8 @@ struct associated_executor<
|
|||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
typename DynamicBuffer_v2, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
DynamicBuffer_v2 buffers, BOOST_ASIO_STRING_VIEW_PARAM delim,
|
||||
|
@ -2545,8 +2435,8 @@ async_read_until(AsyncReadStream& s,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_until_delim_string_v2<AsyncReadStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
detail::initiate_async_read_until_delim_string_v2(),
|
||||
handler, &s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
static_cast<std::string>(delim));
|
||||
}
|
||||
|
||||
|
@ -2751,25 +2641,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_until_expr_v2
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename DynamicBuffer_v2, typename RegEx>
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename RegEx>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
const RegEx& expr) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -2780,12 +2657,9 @@ namespace detail
|
|||
read_until_expr_op_v2<AsyncReadStream,
|
||||
typename decay<DynamicBuffer_v2>::type,
|
||||
RegEx, typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
expr, handler2.value)(boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -2829,10 +2703,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
const boost::regex& expr, BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
|
@ -2842,8 +2715,8 @@ async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_until_expr_v2<AsyncReadStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers), expr);
|
||||
detail::initiate_async_read_until_expr_v2(), handler,
|
||||
&s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers), expr);
|
||||
}
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_BOOST_REGEX)
|
||||
|
@ -3044,26 +2917,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncReadStream>
|
||||
class initiate_async_read_until_match_v2
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler,
|
||||
template <typename ReadHandler, typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename MatchCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
AsyncReadStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
MatchCondition match_condition) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -3074,12 +2933,9 @@ namespace detail
|
|||
read_until_match_op_v2<AsyncReadStream,
|
||||
typename decay<DynamicBuffer_v2>::type,
|
||||
MatchCondition, typename decay<ReadHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
match_condition, handler2.value)(boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncReadStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -3123,11 +2979,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename MatchCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
typename MatchCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
MatchCondition match_condition, BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
|
@ -3138,8 +2992,8 @@ async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_read_until_match_v2<AsyncReadStream>(s), handler,
|
||||
BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers), match_condition);
|
||||
detail::initiate_async_read_until_match_v2(), handler,
|
||||
&s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers), match_condition);
|
||||
}
|
||||
|
||||
#endif // !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
|
|
|
@ -418,26 +418,12 @@ namespace detail
|
|||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
template <typename AsyncWriteStream>
|
||||
class initiate_async_write_buffer_sequence
|
||||
struct initiate_async_write_buffer_sequence
|
||||
{
|
||||
public:
|
||||
typedef typename AsyncWriteStream::executor_type executor_type;
|
||||
|
||||
explicit initiate_async_write_buffer_sequence(AsyncWriteStream& stream)
|
||||
: stream_(stream)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence,
|
||||
typename CompletionCondition>
|
||||
template <typename WriteHandler, typename AsyncWriteStream,
|
||||
typename ConstBufferSequence, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
const ConstBufferSequence& buffers,
|
||||
AsyncWriteStream* s, const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -446,13 +432,10 @@ namespace detail
|
|||
|
||||
non_const_lvalue<WriteHandler> handler2(handler);
|
||||
non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
|
||||
start_write_buffer_sequence_op(stream_, buffers,
|
||||
start_write_buffer_sequence_op(*s, buffers,
|
||||
boost::asio::buffer_sequence_begin(buffers),
|
||||
completion_cond2.value, handler2.value);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncWriteStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -498,11 +481,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncWriteStream,
|
||||
typename ConstBufferSequence, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename ConstBufferSequence,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
|
||||
CompletionCondition completion_condition,
|
||||
|
@ -513,15 +494,13 @@ async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_write_buffer_sequence<AsyncWriteStream>(s),
|
||||
handler, buffers,
|
||||
detail::initiate_async_write_buffer_sequence(), handler, &s, buffers,
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
template <typename AsyncWriteStream, typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
|
@ -531,8 +510,8 @@ async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_write_buffer_sequence<AsyncWriteStream>(s),
|
||||
handler, buffers, transfer_all());
|
||||
detail::initiate_async_write_buffer_sequence(),
|
||||
handler, &s, buffers, transfer_all());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_DYNAMIC_BUFFER_V1)
|
||||
|
@ -650,26 +629,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncWriteStream>
|
||||
class initiate_async_write_dynbuf_v1
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename DynamicBuffer_v1,
|
||||
typename CompletionCondition>
|
||||
template <typename WriteHandler, typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v1, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
AsyncWriteStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -681,13 +646,10 @@ namespace detail
|
|||
write_dynbuf_v1_op<AsyncWriteStream,
|
||||
typename decay<DynamicBuffer_v1>::type,
|
||||
CompletionCondition, typename decay<WriteHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
completion_cond2.value, handler2.value)(
|
||||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncWriteStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -731,10 +693,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncWriteStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v1, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -749,11 +710,9 @@ async_write(AsyncWriteStream& s,
|
|||
transfer_all(), BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
|
||||
}
|
||||
|
||||
template <typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v1, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename DynamicBuffer_v1,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -766,18 +725,16 @@ async_write(AsyncWriteStream& s,
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
detail::initiate_async_write_dynbuf_v1(), handler, &s,
|
||||
BOOST_ASIO_MOVE_CAST(DynamicBuffer_v1)(buffers),
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
#if !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
|
||||
template <typename AsyncWriteStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename Allocator, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -787,11 +744,9 @@ async_write(AsyncWriteStream& s,
|
|||
BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
|
||||
}
|
||||
|
||||
template <typename AsyncWriteStream,
|
||||
typename Allocator, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename Allocator,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -920,26 +875,12 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncWriteStream>
|
||||
class initiate_async_write_dynbuf_v2
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return stream_.get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename DynamicBuffer_v2,
|
||||
typename CompletionCondition>
|
||||
template <typename WriteHandler, typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v2, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
AsyncWriteStream* s, BOOST_ASIO_MOVE_ARG(DynamicBuffer_v2) buffers,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -951,13 +892,10 @@ namespace detail
|
|||
write_dynbuf_v2_op<AsyncWriteStream,
|
||||
typename decay<DynamicBuffer_v2>::type,
|
||||
CompletionCondition, typename decay<WriteHandler>::type>(
|
||||
stream_, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
*s, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
completion_cond2.value, handler2.value)(
|
||||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncWriteStream& stream_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -1001,10 +939,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncWriteStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v2, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
|
@ -1017,11 +954,9 @@ async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
|
|||
transfer_all(), BOOST_ASIO_MOVE_CAST(WriteHandler)(handler));
|
||||
}
|
||||
|
||||
template <typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v2, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename DynamicBuffer_v2,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
|
||||
CompletionCondition completion_condition,
|
||||
|
@ -1032,8 +967,8 @@ async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_write_dynbuf_v2<AsyncWriteStream>(s),
|
||||
handler, BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
detail::initiate_async_write_dynbuf_v2(), handler, &s,
|
||||
BOOST_ASIO_MOVE_CAST(DynamicBuffer_v2)(buffers),
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
|
|
|
@ -306,27 +306,13 @@ namespace detail
|
|||
boost::system::error_code(), 0, 1);
|
||||
}
|
||||
|
||||
template <typename AsyncRandomAccessWriteDevice>
|
||||
class initiate_async_write_at_buffer_sequence
|
||||
struct initiate_async_write_at_buffer_sequence
|
||||
{
|
||||
public:
|
||||
typedef typename AsyncRandomAccessWriteDevice::executor_type executor_type;
|
||||
|
||||
explicit initiate_async_write_at_buffer_sequence(
|
||||
AsyncRandomAccessWriteDevice& device)
|
||||
: device_(device)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return device_.get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence,
|
||||
typename CompletionCondition>
|
||||
template <typename WriteHandler, typename AsyncRandomAccessWriteDevice,
|
||||
typename ConstBufferSequence, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
uint64_t offset, const ConstBufferSequence& buffers,
|
||||
AsyncRandomAccessWriteDevice* d, uint64_t offset,
|
||||
const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -335,13 +321,10 @@ namespace detail
|
|||
|
||||
non_const_lvalue<WriteHandler> handler2(handler);
|
||||
non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
|
||||
start_write_at_buffer_sequence_op(device_, offset, buffers,
|
||||
start_write_at_buffer_sequence_op(*d, offset, buffers,
|
||||
boost::asio::buffer_sequence_begin(buffers),
|
||||
completion_cond2.value, handler2.value);
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncRandomAccessWriteDevice& device_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -389,11 +372,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncRandomAccessWriteDevice,
|
||||
typename ConstBufferSequence, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d,
|
||||
uint64_t offset, const ConstBufferSequence& buffers,
|
||||
|
@ -402,16 +383,13 @@ async_write_at(AsyncRandomAccessWriteDevice& d,
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_write_at_buffer_sequence<
|
||||
AsyncRandomAccessWriteDevice>(d),
|
||||
handler, offset, buffers,
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
detail::initiate_async_write_at_buffer_sequence(), handler, &d, offset,
|
||||
buffers, BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d,
|
||||
uint64_t offset, const ConstBufferSequence& buffers,
|
||||
|
@ -419,9 +397,8 @@ async_write_at(AsyncRandomAccessWriteDevice& d,
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_write_at_buffer_sequence<
|
||||
AsyncRandomAccessWriteDevice>(d),
|
||||
handler, offset, buffers, transfer_all());
|
||||
detail::initiate_async_write_at_buffer_sequence(),
|
||||
handler, &d, offset, buffers, transfer_all());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
|
@ -507,27 +484,13 @@ namespace detail
|
|||
function, this_handler->handler_);
|
||||
}
|
||||
|
||||
template <typename AsyncRandomAccessWriteDevice>
|
||||
class initiate_async_write_at_streambuf
|
||||
struct 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 BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return device_.get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler,
|
||||
template <typename WriteHandler, typename AsyncRandomAccessWriteDevice,
|
||||
typename Allocator, typename CompletionCondition>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
uint64_t offset, basic_streambuf<Allocator>* b,
|
||||
AsyncRandomAccessWriteDevice* d, uint64_t offset,
|
||||
basic_streambuf<Allocator>* b,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_condition) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -535,14 +498,11 @@ namespace detail
|
|||
BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
|
||||
|
||||
non_const_lvalue<WriteHandler> handler2(handler);
|
||||
async_write_at(device_, offset, b->data(),
|
||||
async_write_at(*d, offset, b->data(),
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition),
|
||||
write_at_streambuf_op<Allocator, typename decay<WriteHandler>::type>(
|
||||
*b, handler2.value));
|
||||
}
|
||||
|
||||
private:
|
||||
AsyncRandomAccessWriteDevice& device_;
|
||||
};
|
||||
} // namespace detail
|
||||
|
||||
|
@ -580,11 +540,9 @@ struct associated_executor<
|
|||
|
||||
#endif // !defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
template <typename AsyncRandomAccessWriteDevice,
|
||||
typename Allocator, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncRandomAccessWriteDevice, typename Allocator,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d,
|
||||
uint64_t offset, boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -593,16 +551,13 @@ async_write_at(AsyncRandomAccessWriteDevice& d,
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_write_at_streambuf<
|
||||
AsyncRandomAccessWriteDevice>(d),
|
||||
handler, offset, &b,
|
||||
BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
detail::initiate_async_write_at_streambuf(), handler, &d, offset,
|
||||
&b, BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
|
||||
}
|
||||
|
||||
template <typename AsyncRandomAccessWriteDevice, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
typename WriteHandler>
|
||||
inline BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d,
|
||||
uint64_t offset, boost::asio::basic_streambuf<Allocator>& b,
|
||||
|
@ -610,9 +565,8 @@ async_write_at(AsyncRandomAccessWriteDevice& d,
|
|||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
detail::initiate_async_write_at_streambuf<
|
||||
AsyncRandomAccessWriteDevice>(d),
|
||||
handler, offset, &b, transfer_all());
|
||||
detail::initiate_async_write_at_streambuf(),
|
||||
handler, &d, offset, &b, transfer_all());
|
||||
}
|
||||
|
||||
#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
|
|
|
@ -533,7 +533,7 @@ public:
|
|||
* throws an exception.
|
||||
*/
|
||||
template <typename LegacyCompletionHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
dispatch(BOOST_ASIO_MOVE_ARG(LegacyCompletionHandler) handler);
|
||||
|
||||
/// (Deprecated: Use boost::asio::post().) Request the io_context to invoke
|
||||
|
@ -560,7 +560,7 @@ public:
|
|||
* throws an exception.
|
||||
*/
|
||||
template <typename LegacyCompletionHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
post(BOOST_ASIO_MOVE_ARG(LegacyCompletionHandler) handler);
|
||||
|
||||
/// (Deprecated: Use boost::asio::bind_executor().) Create a new handler that
|
||||
|
|
|
@ -183,7 +183,7 @@ public:
|
|||
* @code void handler(); @endcode
|
||||
*/
|
||||
template <typename LegacyCompletionHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
dispatch(BOOST_ASIO_MOVE_ARG(LegacyCompletionHandler) handler)
|
||||
{
|
||||
return async_initiate<LegacyCompletionHandler, void ()>(
|
||||
|
@ -230,7 +230,7 @@ public:
|
|||
* @code void handler(); @endcode
|
||||
*/
|
||||
template <typename LegacyCompletionHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ())
|
||||
post(BOOST_ASIO_MOVE_ARG(LegacyCompletionHandler) handler)
|
||||
{
|
||||
return async_initiate<LegacyCompletionHandler, void ()>(
|
||||
|
|
|
@ -72,14 +72,6 @@ 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;
|
||||
|
||||
|
@ -621,19 +613,15 @@ public:
|
|||
* A successful resolve operation is guaranteed to pass a non-empty range to
|
||||
* the handler.
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
results_type)) ResolveHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ResolveHandler,
|
||||
template <typename ResolveHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ResolveHandler,
|
||||
void (boost::system::error_code, results_type))
|
||||
async_resolve(const query& q,
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler)
|
||||
{
|
||||
return boost::asio::async_initiate<ResolveHandler,
|
||||
void (boost::system::error_code, results_type)>(
|
||||
initiate_async_resolve(this), handler, q);
|
||||
initiate_async_resolve(), handler, this, q);
|
||||
}
|
||||
#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
|
||||
|
||||
|
@ -679,16 +667,12 @@ public:
|
|||
* <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
|
||||
* may use additional locations when resolving service names.
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
results_type)) ResolveHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ResolveHandler,
|
||||
template <typename ResolveHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ResolveHandler,
|
||||
void (boost::system::error_code, results_type))
|
||||
async_resolve(BOOST_ASIO_STRING_VIEW_PARAM host,
|
||||
BOOST_ASIO_STRING_VIEW_PARAM service,
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler)
|
||||
{
|
||||
return async_resolve(host, service, resolver_base::flags(),
|
||||
BOOST_ASIO_MOVE_CAST(ResolveHandler)(handler));
|
||||
|
@ -741,24 +725,20 @@ public:
|
|||
* <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
|
||||
* may use additional locations when resolving service names.
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
results_type)) ResolveHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ResolveHandler,
|
||||
template <typename ResolveHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ResolveHandler,
|
||||
void (boost::system::error_code, results_type))
|
||||
async_resolve(BOOST_ASIO_STRING_VIEW_PARAM host,
|
||||
BOOST_ASIO_STRING_VIEW_PARAM service,
|
||||
resolver_base::flags resolve_flags,
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler)
|
||||
{
|
||||
basic_resolver_query<protocol_type> q(static_cast<std::string>(host),
|
||||
static_cast<std::string>(service), resolve_flags);
|
||||
|
||||
return boost::asio::async_initiate<ResolveHandler,
|
||||
void (boost::system::error_code, results_type)>(
|
||||
initiate_async_resolve(this), handler, q);
|
||||
initiate_async_resolve(), handler, this, q);
|
||||
}
|
||||
|
||||
/// Asynchronously perform forward resolution of a query to a list of entries.
|
||||
|
@ -806,16 +786,12 @@ public:
|
|||
* <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
|
||||
* may use additional locations when resolving service names.
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
results_type)) ResolveHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ResolveHandler,
|
||||
template <typename ResolveHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ResolveHandler,
|
||||
void (boost::system::error_code, results_type))
|
||||
async_resolve(const protocol_type& protocol,
|
||||
BOOST_ASIO_STRING_VIEW_PARAM host, BOOST_ASIO_STRING_VIEW_PARAM service,
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler)
|
||||
{
|
||||
return async_resolve(protocol, host, service, resolver_base::flags(),
|
||||
BOOST_ASIO_MOVE_CAST(ResolveHandler)(handler));
|
||||
|
@ -871,17 +847,13 @@ public:
|
|||
* <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
|
||||
* may use additional locations when resolving service names.
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
results_type)) ResolveHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ResolveHandler,
|
||||
template <typename ResolveHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ResolveHandler,
|
||||
void (boost::system::error_code, results_type))
|
||||
async_resolve(const protocol_type& protocol,
|
||||
BOOST_ASIO_STRING_VIEW_PARAM host, BOOST_ASIO_STRING_VIEW_PARAM service,
|
||||
resolver_base::flags resolve_flags,
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler)
|
||||
{
|
||||
basic_resolver_query<protocol_type> q(
|
||||
protocol, static_cast<std::string>(host),
|
||||
|
@ -889,7 +861,7 @@ public:
|
|||
|
||||
return boost::asio::async_initiate<ResolveHandler,
|
||||
void (boost::system::error_code, results_type)>(
|
||||
initiate_async_resolve(this), handler, q);
|
||||
initiate_async_resolve(), handler, this, q);
|
||||
}
|
||||
|
||||
/// Perform reverse resolution of an endpoint to a list of entries.
|
||||
|
@ -958,19 +930,15 @@ public:
|
|||
* A successful resolve operation is guaranteed to pass a non-empty range to
|
||||
* the handler.
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
results_type)) ResolveHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ResolveHandler,
|
||||
template <typename ResolveHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ResolveHandler,
|
||||
void (boost::system::error_code, results_type))
|
||||
async_resolve(const endpoint_type& e,
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ResolveHandler) handler)
|
||||
{
|
||||
return boost::asio::async_initiate<ResolveHandler,
|
||||
void (boost::system::error_code, results_type)>(
|
||||
initiate_async_resolve(this), handler, e);
|
||||
initiate_async_resolve(), handler, this, e);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -978,24 +946,11 @@ private:
|
|||
basic_resolver(const basic_resolver&) BOOST_ASIO_DELETED;
|
||||
basic_resolver& operator=(const basic_resolver&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_resolve
|
||||
struct initiate_async_resolve
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_resolve(basic_resolver* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ResolveHandler, typename Query>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ResolveHandler) handler,
|
||||
const Query& q) const
|
||||
basic_resolver* self, 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.
|
||||
|
@ -1003,13 +958,10 @@ private:
|
|||
ResolveHandler, handler, results_type) type_check;
|
||||
|
||||
boost::asio::detail::non_const_lvalue<ResolveHandler> handler2(handler);
|
||||
self_->impl_.get_service().async_resolve(
|
||||
self_->impl_.get_implementation(), q, handler2.value,
|
||||
self_->impl_.get_implementation_executor());
|
||||
self->impl_.get_service().async_resolve(
|
||||
self->impl_.get_implementation(), q, handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_resolver* self_;
|
||||
};
|
||||
|
||||
# if defined(BOOST_ASIO_WINDOWS_RUNTIME)
|
||||
|
|
|
@ -47,33 +47,33 @@ public:
|
|||
typedef basic_endpoint<icmp> endpoint;
|
||||
|
||||
/// Construct to represent the IPv4 ICMP protocol.
|
||||
static icmp v4() BOOST_ASIO_NOEXCEPT
|
||||
static icmp v4()
|
||||
{
|
||||
return icmp(BOOST_ASIO_OS_DEF(IPPROTO_ICMP),
|
||||
BOOST_ASIO_OS_DEF(AF_INET));
|
||||
}
|
||||
|
||||
/// Construct to represent the IPv6 ICMP protocol.
|
||||
static icmp v6() BOOST_ASIO_NOEXCEPT
|
||||
static icmp v6()
|
||||
{
|
||||
return icmp(BOOST_ASIO_OS_DEF(IPPROTO_ICMPV6),
|
||||
BOOST_ASIO_OS_DEF(AF_INET6));
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(SOCK_RAW);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return protocol_;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return family_;
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ public:
|
|||
|
||||
private:
|
||||
// Construct with a specific family.
|
||||
explicit icmp(int protocol_id, int protocol_family) BOOST_ASIO_NOEXCEPT
|
||||
explicit icmp(int protocol_id, int protocol_family)
|
||||
: protocol_(protocol_id),
|
||||
family_(protocol_family)
|
||||
{
|
||||
|
|
|
@ -50,31 +50,31 @@ public:
|
|||
typedef basic_endpoint<tcp> endpoint;
|
||||
|
||||
/// Construct to represent the IPv4 TCP protocol.
|
||||
static tcp v4() BOOST_ASIO_NOEXCEPT
|
||||
static tcp v4()
|
||||
{
|
||||
return tcp(BOOST_ASIO_OS_DEF(AF_INET));
|
||||
}
|
||||
|
||||
/// Construct to represent the IPv6 TCP protocol.
|
||||
static tcp v6() BOOST_ASIO_NOEXCEPT
|
||||
static tcp v6()
|
||||
{
|
||||
return tcp(BOOST_ASIO_OS_DEF(AF_INET6));
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(SOCK_STREAM);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(IPPROTO_TCP);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return family_;
|
||||
}
|
||||
|
@ -140,7 +140,7 @@ public:
|
|||
|
||||
private:
|
||||
// Construct with a specific family.
|
||||
explicit tcp(int protocol_family) BOOST_ASIO_NOEXCEPT
|
||||
explicit tcp(int protocol_family)
|
||||
: family_(protocol_family)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -47,31 +47,31 @@ public:
|
|||
typedef basic_endpoint<udp> endpoint;
|
||||
|
||||
/// Construct to represent the IPv4 UDP protocol.
|
||||
static udp v4() BOOST_ASIO_NOEXCEPT
|
||||
static udp v4()
|
||||
{
|
||||
return udp(BOOST_ASIO_OS_DEF(AF_INET));
|
||||
}
|
||||
|
||||
/// Construct to represent the IPv6 UDP protocol.
|
||||
static udp v6() BOOST_ASIO_NOEXCEPT
|
||||
static udp v6()
|
||||
{
|
||||
return udp(BOOST_ASIO_OS_DEF(AF_INET6));
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(SOCK_DGRAM);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return BOOST_ASIO_OS_DEF(IPPROTO_UDP);
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return family_;
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ public:
|
|||
|
||||
private:
|
||||
// Construct with a specific family.
|
||||
explicit udp(int protocol_family) BOOST_ASIO_NOEXCEPT
|
||||
explicit udp(int protocol_family)
|
||||
: family_(protocol_family)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ public:
|
|||
#endif
|
||||
|
||||
/// Default constructor.
|
||||
basic_endpoint() BOOST_ASIO_NOEXCEPT
|
||||
basic_endpoint()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -46,19 +46,19 @@ class datagram_protocol
|
|||
{
|
||||
public:
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return SOCK_DGRAM;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return AF_UNIX;
|
||||
}
|
||||
|
|
|
@ -48,19 +48,19 @@ class stream_protocol
|
|||
{
|
||||
public:
|
||||
/// Obtain an identifier for the type of the protocol.
|
||||
int type() const BOOST_ASIO_NOEXCEPT
|
||||
int type() const
|
||||
{
|
||||
return SOCK_STREAM;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol.
|
||||
int protocol() const BOOST_ASIO_NOEXCEPT
|
||||
int protocol() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Obtain an identifier for the protocol family.
|
||||
int family() const BOOST_ASIO_NOEXCEPT
|
||||
int family() const
|
||||
{
|
||||
return AF_UNIX;
|
||||
}
|
||||
|
|
|
@ -58,14 +58,6 @@ 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;
|
||||
|
@ -623,17 +615,13 @@ public:
|
|||
* wait_handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
WaitHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WaitHandler,
|
||||
template <typename WaitHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WaitHandler,
|
||||
void (boost::system::error_code))
|
||||
async_wait(wait_type w,
|
||||
BOOST_ASIO_MOVE_ARG(WaitHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_wait(wait_type w, BOOST_ASIO_MOVE_ARG(WaitHandler) handler)
|
||||
{
|
||||
return async_initiate<WaitHandler, void (boost::system::error_code)>(
|
||||
initiate_async_wait(this), handler, w);
|
||||
initiate_async_wait(), handler, this, w);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
@ -654,36 +642,21 @@ private:
|
|||
basic_descriptor(const basic_descriptor&) BOOST_ASIO_DELETED;
|
||||
basic_descriptor& operator=(const basic_descriptor&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_wait
|
||||
struct initiate_async_wait
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_wait(basic_descriptor* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WaitHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler, wait_type w) const
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WaitHandler) handler,
|
||||
basic_descriptor* self, 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.
|
||||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_wait(
|
||||
self->impl_.get_implementation(), w, handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_descriptor* self_;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -45,14 +45,6 @@ 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;
|
||||
|
@ -265,19 +257,15 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_some(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_write_some(this), handler, buffers);
|
||||
initiate_async_write_some(), handler, this, buffers);
|
||||
}
|
||||
|
||||
/// Read some data from the descriptor.
|
||||
|
@ -379,39 +367,23 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_some(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_read_some(this), handler, buffers);
|
||||
initiate_async_read_some(), handler, this, buffers);
|
||||
}
|
||||
|
||||
private:
|
||||
class initiate_async_write_some
|
||||
struct initiate_async_write_some
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_write_some(basic_stream_descriptor* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
basic_stream_descriptor* self,
|
||||
const ConstBufferSequence& buffers) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -419,32 +391,17 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_write_some(
|
||||
self->impl_.get_implementation(), buffers, handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_stream_descriptor* self_;
|
||||
};
|
||||
|
||||
class initiate_async_read_some
|
||||
struct initiate_async_read_some
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_read_some(basic_stream_descriptor* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
basic_stream_descriptor* self,
|
||||
const MutableBufferSequence& buffers) const
|
||||
{
|
||||
// If you get an error on the following line it means that your handler
|
||||
|
@ -452,13 +409,10 @@ private:
|
|||
BOOST_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_implementation_executor());
|
||||
self->impl_.get_service().async_read_some(
|
||||
self->impl_.get_implementation(), buffers, handler2.value,
|
||||
self->impl_.get_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_stream_descriptor* self_;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -53,8 +53,8 @@ namespace asio {
|
|||
*
|
||||
* @li Returns <tt>result.get()</tt>.
|
||||
*/
|
||||
template <BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) post(
|
||||
template <typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token);
|
||||
|
||||
/// Submits a completion token or function object for execution.
|
||||
|
@ -90,28 +90,18 @@ BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) post(
|
|||
*
|
||||
* @li Returns <tt>result.get()</tt>.
|
||||
*/
|
||||
template <typename Executor,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) post(
|
||||
const Executor& ex,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
|
||||
template <typename Executor, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
|
||||
const Executor& ex, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_executor<Executor>::value>::type* = 0);
|
||||
|
||||
/// Submits a completion token or function object for execution.
|
||||
/**
|
||||
* @returns <tt>post(ctx.get_executor(), forward<CompletionToken>(token))</tt>.
|
||||
*/
|
||||
template <typename ExecutionContext,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename ExecutionContext::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) post(
|
||||
ExecutionContext& ctx,
|
||||
BOOST_ASIO_MOVE_ARG(CompletionToken) token
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename ExecutionContext::executor_type),
|
||||
template <typename ExecutionContext, typename CompletionToken>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post(
|
||||
ExecutionContext& ctx, BOOST_ASIO_MOVE_ARG(CompletionToken) token,
|
||||
typename enable_if<is_convertible<
|
||||
ExecutionContext&, execution_context&>::value>::type* = 0);
|
||||
|
||||
|
|
|
@ -761,16 +761,11 @@ std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
* handler); @endcode
|
||||
*/
|
||||
template <typename AsyncReadStream, typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_mutable_buffer_sequence<MutableBufferSequence>::value
|
||||
>::type* = 0);
|
||||
|
@ -838,19 +833,13 @@ async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename AsyncReadStream,
|
||||
typename MutableBufferSequence, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename MutableBufferSequence,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
|
||||
CompletionCondition completion_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_mutable_buffer_sequence<MutableBufferSequence>::value
|
||||
>::type* = 0);
|
||||
|
@ -907,18 +896,13 @@ async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
|
|||
* boost::asio::transfer_all(),
|
||||
* handler); @endcode
|
||||
*/
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
|
||||
&& !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
|
||||
|
@ -982,20 +966,14 @@ async_read(AsyncReadStream& s,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
CompletionCondition completion_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
|
||||
&& !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
|
||||
|
@ -1052,17 +1030,11 @@ async_read(AsyncReadStream& s,
|
|||
* boost::asio::transfer_all(),
|
||||
* handler); @endcode
|
||||
*/
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
/// Start an asynchronous operation to read a certain amount of data from a
|
||||
/// stream.
|
||||
|
@ -1120,19 +1092,13 @@ async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncReadStream,
|
||||
typename Allocator, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
|
||||
CompletionCondition completion_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
#endif // !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
|
@ -1188,17 +1154,12 @@ async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
|
|||
* boost::asio::transfer_all(),
|
||||
* handler); @endcode
|
||||
*/
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v2<DynamicBuffer_v2>::value
|
||||
>::type* = 0);
|
||||
|
@ -1261,19 +1222,13 @@ async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
CompletionCondition completion_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v2<DynamicBuffer_v2>::value
|
||||
>::type* = 0);
|
||||
|
|
|
@ -460,17 +460,12 @@ std::size_t read_at(SyncRandomAccessReadDevice& d,
|
|||
* handler); @endcode
|
||||
*/
|
||||
template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncRandomAccessReadDevice::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset,
|
||||
const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncRandomAccessReadDevice::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
/// Start an asynchronous operation to read a certain amount of data at the
|
||||
/// specified offset.
|
||||
|
@ -537,20 +532,14 @@ async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset,
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename AsyncRandomAccessReadDevice,
|
||||
typename MutableBufferSequence, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncRandomAccessReadDevice::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_at(AsyncRandomAccessReadDevice& d,
|
||||
uint64_t offset, const MutableBufferSequence& buffers,
|
||||
CompletionCondition completion_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncRandomAccessReadDevice::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
#if !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
|
@ -601,17 +590,11 @@ async_read_at(AsyncRandomAccessReadDevice& d,
|
|||
* handler); @endcode
|
||||
*/
|
||||
template <typename AsyncRandomAccessReadDevice, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncRandomAccessReadDevice::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_at(AsyncRandomAccessReadDevice& d,
|
||||
uint64_t offset, basic_streambuf<Allocator>& b,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncRandomAccessReadDevice::executor_type));
|
||||
async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset,
|
||||
basic_streambuf<Allocator>& b, BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
/// Start an asynchronous operation to read a certain amount of data at the
|
||||
/// specified offset.
|
||||
|
@ -666,20 +649,14 @@ async_read_at(AsyncRandomAccessReadDevice& d,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncRandomAccessReadDevice,
|
||||
typename Allocator, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncRandomAccessReadDevice::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncRandomAccessReadDevice, typename Allocator,
|
||||
typename CompletionCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_at(AsyncRandomAccessReadDevice& d,
|
||||
uint64_t offset, basic_streambuf<Allocator>& b,
|
||||
CompletionCondition completion_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncRandomAccessReadDevice::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
#endif // !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
|
|
|
@ -1599,18 +1599,13 @@ std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers, char delim,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
char delim, BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
|
||||
&& !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
|
||||
|
@ -1698,19 +1693,14 @@ async_read_until(AsyncReadStream& s,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
BOOST_ASIO_STRING_VIEW_PARAM delim,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
|
||||
&& !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
|
||||
|
@ -1805,19 +1795,14 @@ async_read_until(AsyncReadStream& s,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
const boost::regex& expr,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
|
||||
&& !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
|
||||
|
@ -1954,20 +1939,13 @@ async_read_until(AsyncReadStream& s,
|
|||
* boost::asio::async_read_until(s, data, match_char('a'), handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v1, typename MatchCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v1,
|
||||
typename MatchCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
MatchCondition match_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
MatchCondition match_condition, BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_match_condition<MatchCondition>::value
|
||||
&& is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
|
||||
|
@ -2054,18 +2032,12 @@ async_read_until(AsyncReadStream& s,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b, char delim,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type));
|
||||
boost::asio::basic_streambuf<Allocator>& b,
|
||||
char delim, BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
/// Start an asynchronous operation to read data into a streambuf until it
|
||||
/// contains a specified delimiter.
|
||||
|
@ -2145,19 +2117,13 @@ async_read_until(AsyncReadStream& s,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b,
|
||||
BOOST_ASIO_STRING_VIEW_PARAM delim,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
#if defined(BOOST_ASIO_HAS_BOOST_REGEX) \
|
||||
|| defined(GENERATING_DOCUMENTATION)
|
||||
|
@ -2244,18 +2210,12 @@ async_read_until(AsyncReadStream& s,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b, const boost::regex& expr,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler);
|
||||
|
||||
#endif // defined(BOOST_ASIO_HAS_BOOST_REGEX)
|
||||
// || defined(GENERATING_DOCUMENTATION)
|
||||
|
@ -2383,19 +2343,13 @@ async_read_until(AsyncReadStream& s,
|
|||
* boost::asio::async_read_until(s, b, match_char('a'), handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <typename AsyncReadStream, typename Allocator, typename MatchCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename Allocator,
|
||||
typename MatchCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s,
|
||||
boost::asio::basic_streambuf<Allocator>& b,
|
||||
MatchCondition match_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
MatchCondition match_condition, BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<is_match_condition<MatchCondition>::value>::type* = 0);
|
||||
|
||||
#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
|
@ -2484,17 +2438,12 @@ async_read_until(AsyncReadStream& s,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers, char delim,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
char delim, BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v2<DynamicBuffer_v2>::value
|
||||
>::type* = 0);
|
||||
|
@ -2581,18 +2530,13 @@ async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers, char delim,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
BOOST_ASIO_STRING_VIEW_PARAM delim,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v2<DynamicBuffer_v2>::value
|
||||
>::type* = 0);
|
||||
|
@ -2686,18 +2630,13 @@ async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
* This data may be the start of a new line, to be extracted by a subsequent
|
||||
* @c async_read_until operation.
|
||||
*/
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
const boost::regex& expr,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v2<DynamicBuffer_v2>::value
|
||||
>::type* = 0);
|
||||
|
@ -2833,19 +2772,12 @@ async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
|||
* boost::asio::async_read_until(s, data, match_char('a'), handler);
|
||||
* @endcode
|
||||
*/
|
||||
template <typename AsyncReadStream,
|
||||
typename DynamicBuffer_v2, typename MatchCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncReadStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename AsyncReadStream, typename DynamicBuffer_v2,
|
||||
typename MatchCondition, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
|
||||
MatchCondition match_condition,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncReadStream::executor_type),
|
||||
MatchCondition match_condition, BOOST_ASIO_MOVE_ARG(ReadHandler) handler,
|
||||
typename enable_if<
|
||||
is_match_condition<MatchCondition>::value
|
||||
&& is_dynamic_buffer_v2<DynamicBuffer_v2>::value
|
||||
|
|
|
@ -46,47 +46,9 @@ namespace asio {
|
|||
template <typename Executor = executor>
|
||||
struct use_awaitable_t
|
||||
{
|
||||
/// Default constructor.
|
||||
BOOST_ASIO_CONSTEXPR use_awaitable_t()
|
||||
{
|
||||
}
|
||||
|
||||
/// 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.
|
||||
executor_with_default(const InnerExecutor& ex) BOOST_ASIO_NOEXCEPT
|
||||
: InnerExecutor(ex)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
/// Type alias to adapt an I/O object to use @c use_awaitable_t as its
|
||||
/// default completion token type.
|
||||
#if defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES) \
|
||||
|| defined(GENERATING_DOCUMENTATION)
|
||||
template <typename T>
|
||||
using as_default_on_t = typename T::template rebind_executor<
|
||||
executor_with_default<typename T::executor_type> >::other;
|
||||
#endif // defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES)
|
||||
// || defined(GENERATING_DOCUMENTATION)
|
||||
|
||||
/// 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 T::template rebind_executor<
|
||||
executor_with_default<typename T::executor_type>
|
||||
>::other
|
||||
as_default_on(BOOST_ASIO_MOVE_ARG(T) object)
|
||||
{
|
||||
return typename as_default_on_t<typename decay<T>::type>::type(
|
||||
BOOST_ASIO_MOVE_CAST(T)(object));
|
||||
}
|
||||
};
|
||||
|
||||
/// A completion token object that represents the currently executing coroutine.
|
||||
|
|
|
@ -18,6 +18,6 @@
|
|||
// BOOST_ASIO_VERSION % 100 is the sub-minor version
|
||||
// BOOST_ASIO_VERSION / 100 % 1000 is the minor version
|
||||
// BOOST_ASIO_VERSION / 100000 is the major version
|
||||
#define BOOST_ASIO_VERSION 101600 // 1.16.0
|
||||
#define BOOST_ASIO_VERSION 101401 // 1.14.1
|
||||
|
||||
#endif // BOOST_ASIO_VERSION_HPP
|
||||
|
|
|
@ -55,14 +55,6 @@ 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;
|
||||
|
@ -371,17 +363,18 @@ public:
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
|
||||
WaitHandler BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WaitHandler,
|
||||
template <typename WaitHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WaitHandler,
|
||||
void (boost::system::error_code))
|
||||
async_wait(
|
||||
BOOST_ASIO_MOVE_ARG(WaitHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
async_wait(BOOST_ASIO_MOVE_ARG(WaitHandler) handler)
|
||||
{
|
||||
return async_initiate<WaitHandler, void (boost::system::error_code)>(
|
||||
initiate_async_wait(this), handler);
|
||||
boost::asio::async_completion<WaitHandler,
|
||||
void (boost::system::error_code)> init(handler);
|
||||
|
||||
impl_.get_service().async_wait(impl_.get_implementation(),
|
||||
init.completion_handler, impl_.get_implementation_executor());
|
||||
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -389,38 +382,6 @@ private:
|
|||
basic_object_handle(const basic_object_handle&) BOOST_ASIO_DELETED;
|
||||
basic_object_handle& operator=(const basic_object_handle&) BOOST_ASIO_DELETED;
|
||||
|
||||
class initiate_async_wait
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_wait(basic_object_handle* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WaitHandler>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(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.
|
||||
BOOST_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_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_object_handle* self_;
|
||||
};
|
||||
|
||||
boost::asio::detail::io_object_impl<
|
||||
boost::asio::detail::win_object_handle_service, Executor> impl_;
|
||||
};
|
||||
|
|
|
@ -58,14 +58,6 @@ 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;
|
||||
|
|
|
@ -44,14 +44,6 @@ 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;
|
||||
|
@ -274,20 +266,26 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_some_at(uint64_t offset,
|
||||
const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_write_some_at(this), handler, offset, buffers);
|
||||
// If you get an error on the following line it means that your handler does
|
||||
// not meet the documented type requirements for a WriteHandler.
|
||||
BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
|
||||
|
||||
boost::asio::async_completion<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)> init(handler);
|
||||
|
||||
this->impl_.get_service().async_write_some_at(
|
||||
this->impl_.get_implementation(), offset,
|
||||
buffers, init.completion_handler,
|
||||
this->impl_.get_implementation_executor());
|
||||
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
/// Read some data from the handle at the specified offset.
|
||||
|
@ -396,88 +394,27 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_some_at(uint64_t offset,
|
||||
const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_read_some_at(this), handler, offset, buffers);
|
||||
// If you get an error on the following line it means that your handler does
|
||||
// not meet the documented type requirements for a ReadHandler.
|
||||
BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
|
||||
|
||||
boost::asio::async_completion<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)> init(handler);
|
||||
|
||||
this->impl_.get_service().async_read_some_at(
|
||||
this->impl_.get_implementation(), offset,
|
||||
buffers, init.completion_handler,
|
||||
this->impl_.get_implementation_executor());
|
||||
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(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.
|
||||
BOOST_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_implementation_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)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(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.
|
||||
BOOST_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_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_random_access_handle* self_;
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace windows
|
||||
|
|
|
@ -47,14 +47,6 @@ 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;
|
||||
|
@ -267,19 +259,25 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename ConstBufferSequence, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_some(const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler)
|
||||
{
|
||||
return async_initiate<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_write_some(this), handler, buffers);
|
||||
// If you get an error on the following line it means that your handler does
|
||||
// not meet the documented type requirements for a WriteHandler.
|
||||
BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
|
||||
|
||||
boost::asio::async_completion<WriteHandler,
|
||||
void (boost::system::error_code, std::size_t)> init(handler);
|
||||
|
||||
this->impl_.get_service().async_write_some(
|
||||
this->impl_.get_implementation(),
|
||||
buffers, init.completion_handler,
|
||||
this->impl_.get_implementation_executor());
|
||||
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
/// Read some data from the handle.
|
||||
|
@ -381,87 +379,26 @@ public:
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename MutableBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) ReadHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ReadHandler,
|
||||
template <typename MutableBufferSequence, typename ReadHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(ReadHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_read_some(const MutableBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(executor_type))
|
||||
BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
|
||||
{
|
||||
return async_initiate<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)>(
|
||||
initiate_async_read_some(this), handler, buffers);
|
||||
// If you get an error on the following line it means that your handler does
|
||||
// not meet the documented type requirements for a ReadHandler.
|
||||
BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
|
||||
|
||||
boost::asio::async_completion<ReadHandler,
|
||||
void (boost::system::error_code, std::size_t)> init(handler);
|
||||
|
||||
this->impl_.get_service().async_read_some(
|
||||
this->impl_.get_implementation(),
|
||||
buffers, init.completion_handler,
|
||||
this->impl_.get_implementation_executor());
|
||||
|
||||
return init.result.get();
|
||||
}
|
||||
|
||||
private:
|
||||
class initiate_async_write_some
|
||||
{
|
||||
public:
|
||||
typedef Executor executor_type;
|
||||
|
||||
explicit initiate_async_write_some(basic_stream_handle* self)
|
||||
: self_(self)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename WriteHandler, typename ConstBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(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.
|
||||
BOOST_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_implementation_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)
|
||||
{
|
||||
}
|
||||
|
||||
executor_type get_executor() const BOOST_ASIO_NOEXCEPT
|
||||
{
|
||||
return self_->get_executor();
|
||||
}
|
||||
|
||||
template <typename ReadHandler, typename MutableBufferSequence>
|
||||
void operator()(BOOST_ASIO_MOVE_ARG(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.
|
||||
BOOST_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_implementation_executor());
|
||||
}
|
||||
|
||||
private:
|
||||
basic_stream_handle* self_;
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace windows
|
||||
|
|
|
@ -755,16 +755,11 @@ std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
|
|||
* std::vector.
|
||||
*/
|
||||
template <typename AsyncWriteStream, typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncWriteStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncWriteStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
typename enable_if<
|
||||
is_const_buffer_sequence<ConstBufferSequence>::value
|
||||
>::type* = 0);
|
||||
|
@ -836,11 +831,9 @@ async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename AsyncWriteStream,
|
||||
typename ConstBufferSequence, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename ConstBufferSequence,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
|
||||
CompletionCondition completion_condition,
|
||||
|
@ -894,18 +887,13 @@ async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncWriteStream, typename DynamicBuffer_v1,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncWriteStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v1, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncWriteStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v1<typename decay<DynamicBuffer_v1>::type>::value
|
||||
&& !is_dynamic_buffer_v2<typename decay<DynamicBuffer_v1>::type>::value
|
||||
|
@ -968,11 +956,9 @@ async_write(AsyncWriteStream& s,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v1, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename DynamicBuffer_v1,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s,
|
||||
BOOST_ASIO_MOVE_ARG(DynamicBuffer_v1) buffers,
|
||||
|
@ -1027,17 +1013,11 @@ async_write(AsyncWriteStream& s,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncWriteStream, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncWriteStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename Allocator, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, basic_streambuf<Allocator>& b,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncWriteStream::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler);
|
||||
|
||||
/// Start an asynchronous operation to write a certain amount of data to a
|
||||
/// stream.
|
||||
|
@ -1094,11 +1074,9 @@ async_write(AsyncWriteStream& s, basic_streambuf<Allocator>& b,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncWriteStream,
|
||||
typename Allocator, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename Allocator,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, basic_streambuf<Allocator>& b,
|
||||
CompletionCondition completion_condition,
|
||||
|
@ -1151,17 +1129,12 @@ async_write(AsyncWriteStream& s, basic_streambuf<Allocator>& b,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncWriteStream, typename DynamicBuffer_v2,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncWriteStream::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v2, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncWriteStream::executor_type),
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
|
||||
typename enable_if<
|
||||
is_dynamic_buffer_v2<DynamicBuffer_v2>::value
|
||||
>::type* = 0);
|
||||
|
@ -1223,11 +1196,9 @@ async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncWriteStream,
|
||||
typename DynamicBuffer_v2, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncWriteStream, typename DynamicBuffer_v2,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
|
||||
CompletionCondition completion_condition,
|
||||
|
|
|
@ -457,17 +457,12 @@ std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset,
|
|||
* std::vector.
|
||||
*/
|
||||
template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncRandomAccessWriteDevice::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset,
|
||||
const ConstBufferSequence& buffers,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncRandomAccessWriteDevice::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler);
|
||||
|
||||
/// Start an asynchronous operation to write a certain amount of data at the
|
||||
/// specified offset.
|
||||
|
@ -540,20 +535,14 @@ async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset,
|
|||
* buffers in one go, and how to use it with arrays, boost::array or
|
||||
* std::vector.
|
||||
*/
|
||||
template <typename AsyncRandomAccessWriteDevice,
|
||||
typename ConstBufferSequence, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncRandomAccessWriteDevice::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d,
|
||||
uint64_t offset, const ConstBufferSequence& buffers,
|
||||
CompletionCondition completion_condition,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncRandomAccessWriteDevice::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler);
|
||||
|
||||
#if !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
#if !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
|
@ -604,17 +593,11 @@ async_write_at(AsyncRandomAccessWriteDevice& d,
|
|||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncRandomAccessWriteDevice, typename Allocator,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncRandomAccessWriteDevice::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d,
|
||||
uint64_t offset, basic_streambuf<Allocator>& b,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncRandomAccessWriteDevice::executor_type));
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset,
|
||||
basic_streambuf<Allocator>& b, BOOST_ASIO_MOVE_ARG(WriteHandler) handler);
|
||||
|
||||
/// Start an asynchronous operation to write a certain amount of data at the
|
||||
/// specified offset.
|
||||
|
@ -675,19 +658,13 @@ async_write_at(AsyncRandomAccessWriteDevice& d,
|
|||
* immediate completion, invocation of the handler will be performed in a
|
||||
* manner equivalent to using boost::asio::post().
|
||||
*/
|
||||
template <typename AsyncRandomAccessWriteDevice,
|
||||
typename Allocator, typename CompletionCondition,
|
||||
BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
|
||||
std::size_t)) WriteHandler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
|
||||
typename AsyncRandomAccessWriteDevice::executor_type)>
|
||||
BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(WriteHandler,
|
||||
template <typename AsyncRandomAccessWriteDevice, typename Allocator,
|
||||
typename CompletionCondition, typename WriteHandler>
|
||||
BOOST_ASIO_INITFN_RESULT_TYPE(WriteHandler,
|
||||
void (boost::system::error_code, std::size_t))
|
||||
async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset,
|
||||
basic_streambuf<Allocator>& b, CompletionCondition completion_condition,
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler
|
||||
BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
|
||||
typename AsyncRandomAccessWriteDevice::executor_type));
|
||||
BOOST_ASIO_MOVE_ARG(WriteHandler) handler);
|
||||
|
||||
#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
|
||||
#endif // !defined(BOOST_ASIO_NO_EXTENSIONS)
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
#ifndef BOOST_ATOMIC_HPP
|
||||
#define BOOST_ATOMIC_HPP
|
||||
|
||||
// Copyright (c) 2011 Helge Bahmann
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// This header includes all Boost.Atomic public headers
|
||||
|
||||
#include <boost/atomic/atomic.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -1,104 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2011 Helge Bahmann
|
||||
* Copyright (c) 2013 Tim Blechmann
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/atomic.hpp
|
||||
*
|
||||
* This header contains definition of \c atomic template and \c atomic_flag.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_ATOMIC_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_ATOMIC_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/capabilities.hpp>
|
||||
#include <boost/atomic/fences.hpp>
|
||||
#include <boost/atomic/atomic_flag.hpp>
|
||||
#include <boost/atomic/detail/atomic_template.hpp>
|
||||
#include <boost/atomic/detail/operations.hpp>
|
||||
#include <boost/atomic/detail/extra_operations.hpp>
|
||||
#if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
|
||||
#include <boost/atomic/detail/fp_operations.hpp>
|
||||
#include <boost/atomic/detail/extra_fp_operations.hpp>
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
|
||||
using atomics::atomic;
|
||||
|
||||
using atomics::atomic_char;
|
||||
using atomics::atomic_uchar;
|
||||
using atomics::atomic_schar;
|
||||
using atomics::atomic_uint8_t;
|
||||
using atomics::atomic_int8_t;
|
||||
using atomics::atomic_ushort;
|
||||
using atomics::atomic_short;
|
||||
using atomics::atomic_uint16_t;
|
||||
using atomics::atomic_int16_t;
|
||||
using atomics::atomic_uint;
|
||||
using atomics::atomic_int;
|
||||
using atomics::atomic_uint32_t;
|
||||
using atomics::atomic_int32_t;
|
||||
using atomics::atomic_ulong;
|
||||
using atomics::atomic_long;
|
||||
using atomics::atomic_uint64_t;
|
||||
using atomics::atomic_int64_t;
|
||||
#ifdef BOOST_HAS_LONG_LONG
|
||||
using atomics::atomic_ullong;
|
||||
using atomics::atomic_llong;
|
||||
#endif
|
||||
using atomics::atomic_address;
|
||||
using atomics::atomic_bool;
|
||||
using atomics::atomic_wchar_t;
|
||||
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
||||
using atomics::atomic_char16_t;
|
||||
#endif
|
||||
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
||||
using atomics::atomic_char32_t;
|
||||
#endif
|
||||
|
||||
using atomics::atomic_int_least8_t;
|
||||
using atomics::atomic_uint_least8_t;
|
||||
using atomics::atomic_int_least16_t;
|
||||
using atomics::atomic_uint_least16_t;
|
||||
using atomics::atomic_int_least32_t;
|
||||
using atomics::atomic_uint_least32_t;
|
||||
using atomics::atomic_int_least64_t;
|
||||
using atomics::atomic_uint_least64_t;
|
||||
using atomics::atomic_int_fast8_t;
|
||||
using atomics::atomic_uint_fast8_t;
|
||||
using atomics::atomic_int_fast16_t;
|
||||
using atomics::atomic_uint_fast16_t;
|
||||
using atomics::atomic_int_fast32_t;
|
||||
using atomics::atomic_uint_fast32_t;
|
||||
using atomics::atomic_int_fast64_t;
|
||||
using atomics::atomic_uint_fast64_t;
|
||||
using atomics::atomic_intmax_t;
|
||||
using atomics::atomic_uintmax_t;
|
||||
|
||||
#if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
|
||||
using atomics::atomic_float_t;
|
||||
using atomics::atomic_double_t;
|
||||
using atomics::atomic_long_double_t;
|
||||
#endif
|
||||
|
||||
using atomics::atomic_size_t;
|
||||
using atomics::atomic_ptrdiff_t;
|
||||
|
||||
#if defined(BOOST_HAS_INTPTR_T)
|
||||
using atomics::atomic_intptr_t;
|
||||
using atomics::atomic_uintptr_t;
|
||||
#endif
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_ATOMIC_ATOMIC_HPP_INCLUDED_
|
|
@ -1,33 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2011 Helge Bahmann
|
||||
* Copyright (c) 2013 Tim Blechmann
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/atomic_flag.hpp
|
||||
*
|
||||
* This header contains definition of \c atomic_flag.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/capabilities.hpp>
|
||||
#include <boost/atomic/detail/operations.hpp>
|
||||
#include <boost/atomic/detail/atomic_flag.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
|
||||
using atomics::atomic_flag;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_
|
|
@ -1,210 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/capabilities.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#include <boost/atomic/detail/platform.hpp>
|
||||
#include <boost/atomic/detail/int_sizes.hpp>
|
||||
#if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
|
||||
#include <boost/atomic/detail/float_sizes.hpp>
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_ATOMIC_EMULATED)
|
||||
#include BOOST_ATOMIC_DETAIL_BACKEND_HEADER(boost/atomic/detail/caps_)
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_INT128_LOCK_FREE
|
||||
#define BOOST_ATOMIC_INT128_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef BOOST_ATOMIC_CHAR_LOCK_FREE
|
||||
#define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_CHAR16_T_LOCK_FREE
|
||||
#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_CHAR32_T_LOCK_FREE
|
||||
#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_WCHAR_T_LOCK_FREE
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_SHORT_LOCK_FREE
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1
|
||||
#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2
|
||||
#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4
|
||||
#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8
|
||||
#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_SHORT_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_INT_LOCK_FREE
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1
|
||||
#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2
|
||||
#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4
|
||||
#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8
|
||||
#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_INT_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_LONG_LOCK_FREE
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1
|
||||
#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2
|
||||
#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4
|
||||
#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8
|
||||
#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_LONG_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_LLONG_LOCK_FREE
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1
|
||||
#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2
|
||||
#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4
|
||||
#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8
|
||||
#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_POINTER_LOCK_FREE
|
||||
#if (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 8
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#elif (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 4
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE
|
||||
|
||||
#ifndef BOOST_ATOMIC_BOOL_LOCK_FREE
|
||||
// We store bools in 1-byte storage in all backends
|
||||
#define BOOST_ATOMIC_BOOL_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_FLAG_LOCK_FREE
|
||||
#define BOOST_ATOMIC_FLAG_LOCK_FREE BOOST_ATOMIC_BOOL_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
|
||||
|
||||
#if !defined(BOOST_ATOMIC_FLOAT_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT)
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 2
|
||||
#define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 4
|
||||
#define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 8
|
||||
#define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 16
|
||||
#define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_FLOAT_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_ATOMIC_DOUBLE_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE)
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 2
|
||||
#define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 4
|
||||
#define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 8
|
||||
#define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 16
|
||||
#define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_DOUBLE_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE)
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 2
|
||||
#define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 4
|
||||
#define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 8
|
||||
#define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 16
|
||||
#define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
|
||||
|
||||
#ifndef BOOST_ATOMIC_THREAD_FENCE
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 0
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_ATOMIC_SIGNAL_FENCE
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 0
|
||||
#endif
|
||||
|
||||
#endif // BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
|
|
@ -1,58 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2018 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/addressof.hpp
|
||||
*
|
||||
* This header defines \c addressof helper function. It is similar to \c boost::addressof but it is more
|
||||
* lightweight and also contains a workaround for some compiler warnings.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_ADDRESSOF_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_ADDRESSOF_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
// Detection logic is based on boost/core/addressof.hpp
|
||||
#if defined(BOOST_MSVC_FULL_VER) && BOOST_MSVC_FULL_VER >= 190024215
|
||||
#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_ADDRESSOF
|
||||
#elif defined(BOOST_GCC) && BOOST_GCC >= 70000
|
||||
#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_ADDRESSOF
|
||||
#elif defined(__has_builtin)
|
||||
#if __has_builtin(__builtin_addressof)
|
||||
#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_ADDRESSOF
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace atomics {
|
||||
namespace detail {
|
||||
|
||||
template< typename T >
|
||||
BOOST_FORCEINLINE T* addressof(T& value) BOOST_NOEXCEPT
|
||||
{
|
||||
#if defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_ADDRESSOF)
|
||||
return __builtin_addressof(value);
|
||||
#else
|
||||
// Note: The point of using a local struct as the intermediate type instead of char is to avoid gcc warnings
|
||||
// if T is a const volatile char*:
|
||||
// warning: casting 'const volatile char* const' to 'const volatile char&' does not dereference pointer
|
||||
// The local struct makes sure T is not related to the cast target type.
|
||||
struct opaque_type;
|
||||
return reinterpret_cast< T* >(&const_cast< opaque_type& >(reinterpret_cast< const volatile opaque_type& >(value)));
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace atomics
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_ADDRESSOF_HPP_INCLUDED_
|
|
@ -1,71 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/atomic_flag.hpp
|
||||
*
|
||||
* This header contains interface definition of \c atomic_flag.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/memory_order.hpp>
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#include <boost/atomic/detail/operations_lockfree.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IMPLEMENTATION NOTE: All interface functions MUST be declared with BOOST_FORCEINLINE,
|
||||
* see comment for convert_memory_order_to_gcc in ops_gcc_atomic.hpp.
|
||||
*/
|
||||
|
||||
namespace boost {
|
||||
namespace atomics {
|
||||
|
||||
#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
|
||||
#define BOOST_ATOMIC_NO_ATOMIC_FLAG_INIT
|
||||
#else
|
||||
#define BOOST_ATOMIC_FLAG_INIT {}
|
||||
#endif
|
||||
|
||||
struct atomic_flag
|
||||
{
|
||||
typedef atomics::detail::operations< 1u, false > operations;
|
||||
typedef operations::storage_type storage_type;
|
||||
|
||||
operations::aligned_storage_type m_storage;
|
||||
|
||||
BOOST_FORCEINLINE BOOST_CONSTEXPR atomic_flag() BOOST_NOEXCEPT : m_storage(0)
|
||||
{
|
||||
}
|
||||
|
||||
BOOST_FORCEINLINE bool test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
||||
{
|
||||
return operations::test_and_set(m_storage.value, order);
|
||||
}
|
||||
|
||||
BOOST_FORCEINLINE void clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
||||
{
|
||||
BOOST_ASSERT(order != memory_order_consume);
|
||||
BOOST_ASSERT(order != memory_order_acquire);
|
||||
BOOST_ASSERT(order != memory_order_acq_rel);
|
||||
operations::clear(m_storage.value, order);
|
||||
}
|
||||
|
||||
BOOST_DELETED_FUNCTION(atomic_flag(atomic_flag const&))
|
||||
BOOST_DELETED_FUNCTION(atomic_flag& operator= (atomic_flag const&))
|
||||
};
|
||||
|
||||
} // namespace atomics
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_
|
File diff suppressed because it is too large
Load diff
|
@ -1,68 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2009 Helge Bahmann
|
||||
* Copyright (c) 2012 Tim Blechmann
|
||||
* Copyright (c) 2013 - 2018 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/bitwise_cast.hpp
|
||||
*
|
||||
* This header defines \c bitwise_cast used to convert between storage and value types
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_
|
||||
|
||||
#include <cstddef>
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#include <boost/atomic/detail/addressof.hpp>
|
||||
#include <boost/atomic/detail/string_ops.hpp>
|
||||
#include <boost/atomic/detail/type_traits/integral_constant.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace atomics {
|
||||
namespace detail {
|
||||
|
||||
template< std::size_t FromSize, typename To >
|
||||
BOOST_FORCEINLINE void clear_padding(To& to, atomics::detail::true_type) BOOST_NOEXCEPT
|
||||
{
|
||||
BOOST_ATOMIC_DETAIL_MEMSET(reinterpret_cast< unsigned char* >(atomics::detail::addressof(to)) + FromSize, 0, sizeof(To) - FromSize);
|
||||
}
|
||||
|
||||
template< std::size_t FromSize, typename To >
|
||||
BOOST_FORCEINLINE void clear_padding(To&, atomics::detail::false_type) BOOST_NOEXCEPT
|
||||
{
|
||||
}
|
||||
|
||||
template< typename To, std::size_t FromSize, typename From >
|
||||
BOOST_FORCEINLINE To bitwise_cast(From const& from) BOOST_NOEXCEPT
|
||||
{
|
||||
To to;
|
||||
BOOST_ATOMIC_DETAIL_MEMCPY
|
||||
(
|
||||
atomics::detail::addressof(to),
|
||||
atomics::detail::addressof(from),
|
||||
(FromSize < sizeof(To) ? FromSize : sizeof(To))
|
||||
);
|
||||
atomics::detail::clear_padding< FromSize >(to, atomics::detail::integral_constant< bool, FromSize < sizeof(To) >());
|
||||
return to;
|
||||
}
|
||||
|
||||
template< typename To, typename From >
|
||||
BOOST_FORCEINLINE To bitwise_cast(From const& from) BOOST_NOEXCEPT
|
||||
{
|
||||
return atomics::detail::bitwise_cast< To, sizeof(From) >(from);
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace atomics
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_
|
|
@ -1,86 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2018 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/bitwise_fp_cast.hpp
|
||||
*
|
||||
* This header defines \c bitwise_fp_cast used to convert between storage and floating point value types
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_BITWISE_FP_CAST_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_BITWISE_FP_CAST_HPP_INCLUDED_
|
||||
|
||||
#include <cstddef>
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#include <boost/atomic/detail/float_sizes.hpp>
|
||||
#include <boost/atomic/detail/bitwise_cast.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace atomics {
|
||||
namespace detail {
|
||||
|
||||
/*!
|
||||
* \brief The type trait returns the size of the value of the specified floating point type
|
||||
*
|
||||
* This size may be less than <tt>sizeof(T)</tt> if the implementation uses padding bytes for a particular FP type. This is
|
||||
* often the case with 80-bit extended double, which is stored in 12 or 16 bytes with padding filled with garbage.
|
||||
*/
|
||||
template< typename T >
|
||||
struct value_sizeof
|
||||
{
|
||||
static BOOST_CONSTEXPR_OR_CONST std::size_t value = sizeof(T);
|
||||
};
|
||||
|
||||
#if defined(BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT_VALUE)
|
||||
template< >
|
||||
struct value_sizeof< float >
|
||||
{
|
||||
static BOOST_CONSTEXPR_OR_CONST std::size_t value = BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT_VALUE;
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE_VALUE)
|
||||
template< >
|
||||
struct value_sizeof< double >
|
||||
{
|
||||
static BOOST_CONSTEXPR_OR_CONST std::size_t value = BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE_VALUE;
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE_VALUE)
|
||||
template< >
|
||||
struct value_sizeof< long double >
|
||||
{
|
||||
static BOOST_CONSTEXPR_OR_CONST std::size_t value = BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE_VALUE;
|
||||
};
|
||||
#endif
|
||||
|
||||
template< typename T >
|
||||
struct value_sizeof< const T > : value_sizeof< T > {};
|
||||
|
||||
template< typename T >
|
||||
struct value_sizeof< volatile T > : value_sizeof< T > {};
|
||||
|
||||
template< typename T >
|
||||
struct value_sizeof< const volatile T > : value_sizeof< T > {};
|
||||
|
||||
|
||||
template< typename To, typename From >
|
||||
BOOST_FORCEINLINE To bitwise_fp_cast(From const& from) BOOST_NOEXCEPT
|
||||
{
|
||||
return atomics::detail::bitwise_cast< To, atomics::detail::value_sizeof< From >::value >(from);
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace atomics
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_BITWISE_FP_CAST_HPP_INCLUDED_
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2009 Helge Bahmann
|
||||
* Copyright (c) 2013 Tim Blechmann
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/caps_gcc_alpha.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
|
||||
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 2
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_
|
|
@ -1,39 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2009 Helge Bahmann
|
||||
* Copyright (c) 2009 Phil Endecott
|
||||
* Copyright (c) 2013 Tim Blechmann
|
||||
* ARM Code by Phil Endecott, based on other architectures.
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/caps_gcc_arm.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#include <boost/atomic/detail/hwcaps_gcc_arm.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 2
|
||||
#if defined(BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD)
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE 2
|
||||
#endif
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
|
||||
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 2
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_
|
|
@ -1,133 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/caps_gcc_atomic.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#include <boost/atomic/detail/int_sizes.hpp>
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#include <boost/atomic/detail/hwcaps_gcc_x86.hpp>
|
||||
#elif defined(__arm__)
|
||||
#include <boost/atomic/detail/hwcaps_gcc_arm.hpp>
|
||||
#elif defined(__POWERPC__) || defined(__PPC__)
|
||||
#include <boost/atomic/detail/hwcaps_gcc_ppc.hpp>
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
|
||||
#define BOOST_ATOMIC_INT128_LOCK_FREE 2
|
||||
#else
|
||||
#define BOOST_ATOMIC_INT128_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
#if (__GCC_ATOMIC_LLONG_LOCK_FREE == 2) || (defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) && BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8)
|
||||
#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
|
||||
#else
|
||||
#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#if (__GCC_ATOMIC_LONG_LOCK_FREE == 2) || (defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) && BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8)
|
||||
#define BOOST_ATOMIC_LONG_LOCK_FREE 2
|
||||
#else
|
||||
#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#if __GCC_ATOMIC_INT_LOCK_FREE == 2
|
||||
#define BOOST_ATOMIC_INT_LOCK_FREE 2
|
||||
#else
|
||||
#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#if __GCC_ATOMIC_SHORT_LOCK_FREE == 2
|
||||
#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
|
||||
#else
|
||||
#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#if __GCC_ATOMIC_CHAR_LOCK_FREE == 2
|
||||
#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
|
||||
#else
|
||||
#define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
|
||||
#endif
|
||||
|
||||
#if __GCC_ATOMIC_POINTER_LOCK_FREE == 2
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
|
||||
#else
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE BOOST_ATOMIC_CHAR_LOCK_FREE
|
||||
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
|
||||
#if __GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
|
||||
#else
|
||||
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
|
||||
#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
|
||||
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 2
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2009 Helge Bahmann
|
||||
* Copyright (c) 2013 Tim Blechmann
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/caps_gcc_ppc.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#include <boost/atomic/detail/hwcaps_gcc_ppc.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 2
|
||||
#if defined(BOOST_ATOMIC_DETAIL_PPC_HAS_LDARX_STDCX)
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE 2
|
||||
#endif
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
|
||||
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 2
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2010 Helge Bahmann
|
||||
* Copyright (c) 2013 Tim Blechmann
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/caps_gcc_sparc.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
|
||||
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 2
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_
|
|
@ -1,61 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2011 Helge Bahmann
|
||||
* Copyright (c) 2013 Tim Blechmann
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/caps_gcc_sync.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#include <boost/atomic/detail/hwcaps_gcc_x86.hpp>
|
||||
#elif defined(__arm__)
|
||||
#include <boost/atomic/detail/hwcaps_gcc_arm.hpp>
|
||||
#elif defined(__POWERPC__) || defined(__PPC__)
|
||||
#include <boost/atomic/detail/hwcaps_gcc_ppc.hpp>
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE 2
|
||||
#endif
|
||||
#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 2
|
||||
#endif
|
||||
#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 2
|
||||
#endif
|
||||
#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\
|
||||
|| defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE 2
|
||||
#endif
|
||||
#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
|
||||
#define BOOST_ATOMIC_INT128_LOCK_FREE 2
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 2
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_
|
|
@ -1,40 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2009 Helge Bahmann
|
||||
* Copyright (c) 2012 Tim Blechmann
|
||||
* Copyright (c) 2013 - 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/caps_gcc_x86.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
#include <boost/atomic/detail/hwcaps_gcc_x86.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 2
|
||||
#if defined(__x86_64__) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
|
||||
#define BOOST_ATOMIC_INT64_LOCK_FREE 2
|
||||
#endif
|
||||
#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
|
||||
#define BOOST_ATOMIC_INT128_LOCK_FREE 2
|
||||
#endif
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
|
||||
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 2
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Copyright (c) 2009, 2011 Helge Bahmann
|
||||
* Copyright (c) 2009 Phil Endecott
|
||||
* Copyright (c) 2013 Tim Blechmann
|
||||
* Linux-specific code by Phil Endecott
|
||||
* Copyright (c) 2014 Andrey Semashev
|
||||
*/
|
||||
/*!
|
||||
* \file atomic/detail/caps_linux_arm.hpp
|
||||
*
|
||||
* This header defines feature capabilities macros
|
||||
*/
|
||||
|
||||
#ifndef BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_
|
||||
#define BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_
|
||||
|
||||
#include <boost/atomic/detail/config.hpp>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#define BOOST_ATOMIC_INT8_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT16_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_INT32_LOCK_FREE 2
|
||||
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
|
||||
|
||||
#define BOOST_ATOMIC_THREAD_FENCE 2
|
||||
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
||||
|
||||
#endif // BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue