diff options
author | Tobias Markmann <tm@ayena.de> | 2014-10-19 20:22:58 (GMT) |
---|---|---|
committer | Tobias Markmann <tm@ayena.de> | 2014-10-20 13:49:33 (GMT) |
commit | 6b22dfcf59474dd016a0355a3102a1dd3692d92c (patch) | |
tree | 2b1fd33be433a91e81fee84fdc2bf1b52575d934 /3rdParty/Boost/src/boost/asio/buffer.hpp | |
parent | 38b0cb785fea8eae5e48fae56440695fdfd10ee1 (diff) | |
download | swift-contrib-6b22dfcf59474dd016a0355a3102a1dd3692d92c.zip swift-contrib-6b22dfcf59474dd016a0355a3102a1dd3692d92c.tar.bz2 |
Update Boost in 3rdParty to version 1.56.0.
This updates Boost in our 3rdParty directory to version 1.56.0.
Updated our update.sh script to stop on error.
Changed error reporting in SwiftTools/CrashReporter.cpp to SWIFT_LOG due to
missing include of <iostream> with newer Boost.
Change-Id: I4b35c77de951333979a524097f35f5f83d325edc
Diffstat (limited to '3rdParty/Boost/src/boost/asio/buffer.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/asio/buffer.hpp | 149 |
1 files changed, 124 insertions, 25 deletions
diff --git a/3rdParty/Boost/src/boost/asio/buffer.hpp b/3rdParty/Boost/src/boost/asio/buffer.hpp index 532cfd1..450face 100644 --- a/3rdParty/Boost/src/boost/asio/buffer.hpp +++ b/3rdParty/Boost/src/boost/asio/buffer.hpp @@ -1,59 +1,65 @@ // // buffer.hpp // ~~~~~~~~~~ // -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef BOOST_ASIO_BUFFER_HPP #define BOOST_ASIO_BUFFER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include <boost/asio/detail/config.hpp> #include <cstddef> #include <cstring> #include <string> #include <vector> -#include <boost/detail/workaround.hpp> #include <boost/asio/detail/array_fwd.hpp> -#if defined(BOOST_MSVC) +#if defined(BOOST_ASIO_MSVC) # if defined(_HAS_ITERATOR_DEBUGGING) && (_HAS_ITERATOR_DEBUGGING != 0) # if !defined(BOOST_ASIO_DISABLE_BUFFER_DEBUGGING) # define BOOST_ASIO_ENABLE_BUFFER_DEBUGGING # endif // !defined(BOOST_ASIO_DISABLE_BUFFER_DEBUGGING) # endif // defined(_HAS_ITERATOR_DEBUGGING) -#endif // defined(BOOST_MSVC) +#endif // defined(BOOST_ASIO_MSVC) #if defined(__GNUC__) # if defined(_GLIBCXX_DEBUG) # if !defined(BOOST_ASIO_DISABLE_BUFFER_DEBUGGING) # define BOOST_ASIO_ENABLE_BUFFER_DEBUGGING # endif // !defined(BOOST_ASIO_DISABLE_BUFFER_DEBUGGING) # endif // defined(_GLIBCXX_DEBUG) #endif // defined(__GNUC__) #if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING) -# include <boost/function.hpp> +# include <boost/asio/detail/function.hpp> #endif // BOOST_ASIO_ENABLE_BUFFER_DEBUGGING -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) \ - || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) -# include <boost/type_traits/is_const.hpp> -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) - // || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) +#if defined(BOOST_ASIO_HAS_BOOST_WORKAROUND) +# include <boost/detail/workaround.hpp> +# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) \ + || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) +# define BOOST_ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND +# endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) + // || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) +#endif // defined(BOOST_ASIO_HAS_BOOST_WORKAROUND) + +#if defined(BOOST_ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) +# include <boost/asio/detail/type_traits.hpp> +#endif // defined(BOOST_ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) #include <boost/asio/detail/push_options.hpp> namespace boost { namespace asio { class mutable_buffer; class const_buffer; @@ -96,42 +102,42 @@ public: /// Construct a buffer to represent a given memory range. mutable_buffer(void* data, std::size_t size) : data_(data), size_(size) { } #if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING) mutable_buffer(void* data, std::size_t size, - boost::function<void()> debug_check) + boost::asio::detail::function<void()> debug_check) : data_(data), size_(size), debug_check_(debug_check) { } - const boost::function<void()>& get_debug_check() const + const boost::asio::detail::function<void()>& get_debug_check() const { return debug_check_; } #endif // BOOST_ASIO_ENABLE_BUFFER_DEBUGGING private: friend void* boost::asio::detail::buffer_cast_helper( const mutable_buffer& b); friend std::size_t boost::asio::detail::buffer_size_helper( const mutable_buffer& b); void* data_; std::size_t size_; #if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING) - boost::function<void()> debug_check_; + boost::asio::detail::function<void()> debug_check_; #endif // BOOST_ASIO_ENABLE_BUFFER_DEBUGGING }; namespace detail { inline void* buffer_cast_helper(const mutable_buffer& b) { #if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING) if (b.size_ && b.debug_check_) @@ -226,42 +232,42 @@ public: size_(boost::asio::detail::buffer_size_helper(b)) #if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING) , debug_check_(b.get_debug_check()) #endif // BOOST_ASIO_ENABLE_BUFFER_DEBUGGING { } #if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING) const_buffer(const void* data, std::size_t size, - boost::function<void()> debug_check) + boost::asio::detail::function<void()> debug_check) : data_(data), size_(size), debug_check_(debug_check) { } - const boost::function<void()>& get_debug_check() const + const boost::asio::detail::function<void()>& get_debug_check() const { return debug_check_; } #endif // BOOST_ASIO_ENABLE_BUFFER_DEBUGGING private: friend const void* boost::asio::detail::buffer_cast_helper( const const_buffer& b); friend std::size_t boost::asio::detail::buffer_size_helper( const const_buffer& b); const void* data_; std::size_t size_; #if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING) - boost::function<void()> debug_check_; + boost::asio::detail::function<void()> debug_check_; #endif // BOOST_ASIO_ENABLE_BUFFER_DEBUGGING }; namespace detail { inline const void* buffer_cast_helper(const const_buffer& b) { #if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING) if (b.size_ && b.debug_check_) @@ -506,24 +512,24 @@ class buffer_debug_check { public: buffer_debug_check(Iterator iter) : iter_(iter) { } ~buffer_debug_check() { -#if BOOST_WORKAROUND(BOOST_MSVC, == 1400) +#if defined(BOOST_ASIO_MSVC) && (BOOST_ASIO_MSVC == 1400) // MSVC 8's string iterator checking may crash in a std::string::iterator // object's destructor when the iterator points to an already-destroyed // std::string object, unless the iterator is cleared first. iter_ = Iterator(); -#endif // BOOST_WORKAROUND(BOOST_MSVC, == 1400) +#endif // defined(BOOST_ASIO_MSVC) && (BOOST_ASIO_MSVC == 1400) } void operator()() { *iter_; } private: Iterator iter_; @@ -606,18 +612,21 @@ private: * * In particular, when used with the @ref buffer_size, the @ref buffer_copy * function can be used to linearise a sequence of buffers. For example: * * @code vector<const_buffer> buffers = ...; * * vector<unsigned char> data(boost::asio::buffer_size(buffers)); * boost::asio::buffer_copy(boost::asio::buffer(data), buffers); @endcode * + * Note that @ref buffer_copy is implemented in terms of @c memcpy, and + * consequently it cannot be used to copy between overlapping memory regions. + * * @par Buffer Invalidation * * A buffer object does not have any ownership of the memory it refers to. It * is the responsibility of the application to ensure the memory region remains * valid until it is no longer required for an I/O operation. When the memory * is no longer available, the buffer is said to have been invalidated. * * For the boost::asio::buffer overloads that accept an argument of type * std::vector, the buffer objects returned are invalidated by any vector @@ -822,20 +831,19 @@ template <typename PodType, std::size_t N> inline const_buffers_1 buffer(const PodType (&data)[N], std::size_t max_size_in_bytes) { return const_buffers_1( const_buffer(data, N * sizeof(PodType) < max_size_in_bytes ? N * sizeof(PodType) : max_size_in_bytes)); } -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) \ - || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) +#if defined(BOOST_ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) // Borland C++ and Sun Studio think the overloads: // // unspecified buffer(boost::array<PodType, N>& array ...); // // and // // unspecified buffer(boost::array<const PodType, N>& array ...); // @@ -858,19 +866,19 @@ struct buffer_types_base<false> template <> struct buffer_types_base<true> { typedef const_buffer buffer_type; typedef const_buffers_1 container_type; }; template <typename PodType> struct buffer_types - : public buffer_types_base<boost::is_const<PodType>::value> + : public buffer_types_base<is_const<PodType>::value> { }; } // namespace detail template <typename PodType, std::size_t N> inline typename detail::buffer_types<PodType>::container_type buffer(boost::array<PodType, N>& data) { @@ -890,20 +898,19 @@ buffer(boost::array<PodType, N>& data, std::size_t max_size_in_bytes) buffer_type; typedef typename boost::asio::detail::buffer_types<PodType>::container_type container_type; return container_type( buffer_type(data.c_array(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes)); } -#else // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) - // || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) +#else // defined(BOOST_ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) /// Create a new modifiable buffer that represents the given POD array. /** * @returns A mutable_buffers_1 value equivalent to: * @code mutable_buffers_1( * data.data(), * data.size() * sizeof(PodType)); @endcode */ template <typename PodType, std::size_t N> @@ -955,20 +962,19 @@ template <typename PodType, std::size_t N> inline const_buffers_1 buffer(boost::array<const PodType, N>& data, std::size_t max_size_in_bytes) { return const_buffers_1( const_buffer(data.data(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes)); } -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) - // || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) +#endif // defined(BOOST_ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffers_1 value equivalent to: * @code const_buffers_1( * data.data(), * data.size() * sizeof(PodType)); @endcode */ template <typename PodType, std::size_t N> @@ -1256,36 +1262,42 @@ inline const_buffers_1 buffer( * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c If specified, @c max_bytes_to_copy. * * This prevents buffer overflow, regardless of the buffer sizes used in the * copy operation. + * + * Note that @ref buffer_copy is implemented in terms of @c memcpy, and + * consequently it cannot be used to copy between overlapping memory regions. */ /*@{*/ /// Copies bytes from a source buffer to a target buffer. /** * @param target A modifiable buffer representing the memory region to which * the bytes will be copied. * * @param source A non-modifiable buffer representing the memory region from * which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffer& target, const const_buffer& source) { using namespace std; // For memcpy. std::size_t target_size = buffer_size(target); std::size_t source_size = buffer_size(source); std::size_t n = target_size < source_size ? target_size : source_size; memcpy(buffer_cast<void*>(target), buffer_cast<const void*>(source), n); @@ -1301,18 +1313,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffer& target, const const_buffers_1& source) { return buffer_copy(target, static_cast<const const_buffer&>(source)); } /// Copies bytes from a source buffer to a target buffer. /** @@ -1324,18 +1339,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * modified. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffer& target, const mutable_buffer& source) { return buffer_copy(target, const_buffer(source)); } /// Copies bytes from a source buffer to a target buffer. /** @@ -1347,18 +1365,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * modified. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffer& target, const mutable_buffers_1& source) { return buffer_copy(target, const_buffer(source)); } /// Copies bytes from a source buffer sequence to a target buffer. /** @@ -1369,18 +1390,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * regions from which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename ConstBufferSequence> std::size_t buffer_copy(const mutable_buffer& target, const ConstBufferSequence& source) { std::size_t total_bytes_copied = 0; typename ConstBufferSequence::const_iterator source_iter = source.begin(); typename ConstBufferSequence::const_iterator source_end = source.end(); @@ -1406,18 +1430,21 @@ std::size_t buffer_copy(const mutable_buffer& target, * which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffers_1& target, const const_buffer& source) { return buffer_copy(static_cast<const mutable_buffer&>(target), source); } /// Copies bytes from a source buffer to a target buffer. /** @@ -1428,18 +1455,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffers_1& target, const const_buffers_1& source) { return buffer_copy(static_cast<const mutable_buffer&>(target), static_cast<const const_buffer&>(source)); } /// Copies bytes from a source buffer to a target buffer. @@ -1452,18 +1482,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * modified. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffers_1& target, const mutable_buffer& source) { return buffer_copy(static_cast<const mutable_buffer&>(target), const_buffer(source)); } /// Copies bytes from a source buffer to a target buffer. @@ -1476,18 +1509,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * modified. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffers_1& target, const mutable_buffers_1& source) { return buffer_copy(static_cast<const mutable_buffer&>(target), const_buffer(source)); } /// Copies bytes from a source buffer sequence to a target buffer. @@ -1499,18 +1535,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * regions from which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename ConstBufferSequence> inline std::size_t buffer_copy(const mutable_buffers_1& target, const ConstBufferSequence& source) { return buffer_copy(static_cast<const mutable_buffer&>(target), source); } /// Copies bytes from a source buffer to a target buffer sequence. @@ -1522,18 +1561,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence> std::size_t buffer_copy(const MutableBufferSequence& target, const const_buffer& source) { std::size_t total_bytes_copied = 0; typename MutableBufferSequence::const_iterator target_iter = target.begin(); typename MutableBufferSequence::const_iterator target_end = target.end(); @@ -1559,18 +1601,21 @@ std::size_t buffer_copy(const MutableBufferSequence& target, * which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence> inline std::size_t buffer_copy(const MutableBufferSequence& target, const const_buffers_1& source) { return buffer_copy(target, static_cast<const const_buffer&>(source)); } /// Copies bytes from a source buffer to a target buffer sequence. @@ -1583,18 +1628,21 @@ inline std::size_t buffer_copy(const MutableBufferSequence& target, * modified. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence> inline std::size_t buffer_copy(const MutableBufferSequence& target, const mutable_buffer& source) { return buffer_copy(target, const_buffer(source)); } /// Copies bytes from a source buffer to a target buffer sequence. @@ -1607,18 +1655,21 @@ inline std::size_t buffer_copy(const MutableBufferSequence& target, * modified. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence> inline std::size_t buffer_copy(const MutableBufferSequence& target, const mutable_buffers_1& source) { return buffer_copy(target, const_buffer(source)); } /// Copies bytes from a source buffer sequence to a target buffer sequence. @@ -1630,18 +1681,21 @@ inline std::size_t buffer_copy(const MutableBufferSequence& target, * regions from which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence, typename ConstBufferSequence> std::size_t buffer_copy(const MutableBufferSequence& target, const ConstBufferSequence& source) { std::size_t total_bytes_copied = 0; typename MutableBufferSequence::const_iterator target_iter = target.begin(); typename MutableBufferSequence::const_iterator target_end = target.end(); @@ -1695,18 +1749,21 @@ std::size_t buffer_copy(const MutableBufferSequence& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffer& target, const const_buffer& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer to a target buffer. /** @@ -1721,18 +1778,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffer& target, const const_buffers_1& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer to a target buffer. /** @@ -1748,18 +1808,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffer& target, const mutable_buffer& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer to a target buffer. /** @@ -1775,18 +1838,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffer& target, const mutable_buffers_1& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer sequence to a target /// buffer. @@ -1802,18 +1868,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename ConstBufferSequence> inline std::size_t buffer_copy(const mutable_buffer& target, const ConstBufferSequence& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer to a target buffer. @@ -1829,18 +1898,21 @@ inline std::size_t buffer_copy(const mutable_buffer& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffers_1& target, const const_buffer& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer to a target buffer. /** @@ -1855,18 +1927,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffers_1& target, const const_buffers_1& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer to a target buffer. /** @@ -1882,18 +1957,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffers_1& target, const mutable_buffer& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer to a target buffer. /** @@ -1909,18 +1987,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ inline std::size_t buffer_copy(const mutable_buffers_1& target, const mutable_buffers_1& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer sequence to a target /// buffer. @@ -1936,18 +2017,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename ConstBufferSequence> inline std::size_t buffer_copy(const mutable_buffers_1& target, const ConstBufferSequence& source, std::size_t max_bytes_to_copy) { return buffer_copy(buffer(target, max_bytes_to_copy), source); } /// Copies a limited number of bytes from a source buffer to a target buffer @@ -1964,18 +2048,21 @@ inline std::size_t buffer_copy(const mutable_buffers_1& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence> inline std::size_t buffer_copy(const MutableBufferSequence& target, const const_buffer& source, std::size_t max_bytes_to_copy) { return buffer_copy(target, buffer(source, max_bytes_to_copy)); } /// Copies a limited number of bytes from a source buffer to a target buffer @@ -1992,18 +2079,21 @@ inline std::size_t buffer_copy(const MutableBufferSequence& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence> inline std::size_t buffer_copy(const MutableBufferSequence& target, const const_buffers_1& source, std::size_t max_bytes_to_copy) { return buffer_copy(target, buffer(source, max_bytes_to_copy)); } /// Copies a limited number of bytes from a source buffer to a target buffer @@ -2021,18 +2111,21 @@ inline std::size_t buffer_copy(const MutableBufferSequence& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence> inline std::size_t buffer_copy(const MutableBufferSequence& target, const mutable_buffer& source, std::size_t max_bytes_to_copy) { return buffer_copy(target, buffer(source, max_bytes_to_copy)); } /// Copies a limited number of bytes from a source buffer to a target buffer @@ -2050,18 +2143,21 @@ inline std::size_t buffer_copy(const MutableBufferSequence& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence> inline std::size_t buffer_copy(const MutableBufferSequence& target, const mutable_buffers_1& source, std::size_t max_bytes_to_copy) { return buffer_copy(target, buffer(source, max_bytes_to_copy)); } /// Copies a limited number of bytes from a source buffer sequence to a target @@ -2078,18 +2174,21 @@ inline std::size_t buffer_copy(const MutableBufferSequence& target, * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy + * + * This function is implemented in terms of @c memcpy, and consequently it + * cannot be used to copy between overlapping memory regions. */ template <typename MutableBufferSequence, typename ConstBufferSequence> std::size_t buffer_copy(const MutableBufferSequence& target, const ConstBufferSequence& source, std::size_t max_bytes_to_copy) { std::size_t total_bytes_copied = 0; typename MutableBufferSequence::const_iterator target_iter = target.begin(); typename MutableBufferSequence::const_iterator target_end = target.end(); |