📄 buffer.hpp
字号:
//// buffer.hpp// ~~~~~~~~~~//// Copyright (c) 2003-2007 Christopher M. Kohlhoff (chris at kohlhoff dot com)//// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//#ifndef ASIO_BUFFER_HPP#define ASIO_BUFFER_HPP#if defined(_MSC_VER) && (_MSC_VER >= 1200)# pragma once#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)#include "asio/detail/push_options.hpp"#include "asio/detail/push_options.hpp"#include <cstddef>#include <boost/config.hpp>#include <boost/array.hpp>#include <boost/type_traits/is_const.hpp>#include <string>#include <vector>#include "asio/detail/pop_options.hpp"#if defined(BOOST_MSVC)# if defined(_HAS_ITERATOR_DEBUGGING) && (_HAS_ITERATOR_DEBUGGING != 0)# if !defined(ASIO_DISABLE_BUFFER_DEBUGGING)# define ASIO_ENABLE_BUFFER_DEBUGGING# endif // !defined(ASIO_DISABLE_BUFFER_DEBUGGING)# endif // defined(_HAS_ITERATOR_DEBUGGING)#endif // defined(BOOST_MSVC)#if defined(__GNUC__)# if defined(_GLIBCXX_DEBUG)# if !defined(ASIO_DISABLE_BUFFER_DEBUGGING)# define ASIO_ENABLE_BUFFER_DEBUGGING# endif // !defined(ASIO_DISABLE_BUFFER_DEBUGGING)# endif // defined(_GLIBCXX_DEBUG)#endif // defined(__GNUC__)#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)# include "asio/detail/push_options.hpp"# include <boost/function.hpp># include "asio/detail/pop_options.hpp"#endif // ASIO_ENABLE_BUFFER_DEBUGGINGnamespace asio {class mutable_buffer;class const_buffer;namespace detail {void* buffer_cast_helper(const mutable_buffer&);const void* buffer_cast_helper(const const_buffer&);std::size_t buffer_size_helper(const mutable_buffer&);std::size_t buffer_size_helper(const const_buffer&);} // namespace detail/// Holds a buffer that can be modified./** * The mutable_buffer class provides a safe representation of a buffer that can * be modified. It does not own the underlying data, and so is cheap to copy or * assign. */class mutable_buffer{public: /// Construct an empty buffer. mutable_buffer() : data_(0), size_(0) { } /// Construct a buffer to represent a given memory range. mutable_buffer(void* data, std::size_t size) : data_(data), size_(size) { }#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) mutable_buffer(void* data, std::size_t size, boost::function<void()> debug_check) : data_(data), size_(size), debug_check_(debug_check) { } const boost::function<void()>& get_debug_check() const { return debug_check_; }#endif // ASIO_ENABLE_BUFFER_DEBUGGINGprivate: friend void* asio::detail::buffer_cast_helper( const mutable_buffer& b); friend std::size_t asio::detail::buffer_size_helper( const mutable_buffer& b); void* data_; std::size_t size_;#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) boost::function<void()> debug_check_;#endif // ASIO_ENABLE_BUFFER_DEBUGGING};namespace detail {inline void* buffer_cast_helper(const mutable_buffer& b){#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) if (b.size_ && b.debug_check_) b.debug_check_();#endif // ASIO_ENABLE_BUFFER_DEBUGGING return b.data_;}inline std::size_t buffer_size_helper(const mutable_buffer& b){ return b.size_;}} // namespace detail/// Cast a non-modifiable buffer to a specified pointer to POD type./** * @relates mutable_buffer */template <typename PointerToPodType>inline PointerToPodType buffer_cast(const mutable_buffer& b){ return static_cast<PointerToPodType>(detail::buffer_cast_helper(b));}/// Get the number of bytes in a non-modifiable buffer./** * @relates mutable_buffer */inline std::size_t buffer_size(const mutable_buffer& b){ return detail::buffer_size_helper(b);}/// Create a new modifiable buffer that is offset from the start of another./** * @relates mutable_buffer */inline mutable_buffer operator+(const mutable_buffer& b, std::size_t start){ if (start > buffer_size(b)) return mutable_buffer(); char* new_data = buffer_cast<char*>(b) + start; std::size_t new_size = buffer_size(b) - start; return mutable_buffer(new_data, new_size#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , b.get_debug_check()#endif // ASIO_ENABLE_BUFFER_DEBUGGING );}/// Create a new modifiable buffer that is offset from the start of another./** * @relates mutable_buffer */inline mutable_buffer operator+(std::size_t start, const mutable_buffer& b){ if (start > buffer_size(b)) return mutable_buffer(); char* new_data = buffer_cast<char*>(b) + start; std::size_t new_size = buffer_size(b) - start; return mutable_buffer(new_data, new_size#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , b.get_debug_check()#endif // ASIO_ENABLE_BUFFER_DEBUGGING );}/// Adapts a single modifiable buffer so that it meets the requirements of the/// MutableBufferSequence concept.class mutable_buffers_1 : public mutable_buffer{public: /// The type for each element in the list of buffers. typedef mutable_buffer value_type; /// A random-access iterator type that may be used to read elements. typedef const mutable_buffer* const_iterator; /// Construct to represent a single modifiable buffer. explicit mutable_buffers_1(const mutable_buffer& b) : mutable_buffer(b) { } /// Get a random-access iterator to the first element. const_iterator begin() const { return this; } /// Get a random-access iterator for one past the last element. const_iterator end() const { return begin() + 1; }};/// Holds a buffer that cannot be modified./** * The const_buffer class provides a safe representation of a buffer that cannot * be modified. It does not own the underlying data, and so is cheap to copy or * assign. */class const_buffer{public: /// Construct an empty buffer. const_buffer() : data_(0), size_(0) { } /// Construct a buffer to represent a given memory range. const_buffer(const void* data, std::size_t size) : data_(data), size_(size) { } /// Construct a non-modifiable buffer from a modifiable one. const_buffer(const mutable_buffer& b) : data_(asio::detail::buffer_cast_helper(b)), size_(asio::detail::buffer_size_helper(b))#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , debug_check_(b.get_debug_check())#endif // ASIO_ENABLE_BUFFER_DEBUGGING { }#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) const_buffer(const void* data, std::size_t size, boost::function<void()> debug_check) : data_(data), size_(size), debug_check_(debug_check) { } const boost::function<void()>& get_debug_check() const { return debug_check_; }#endif // ASIO_ENABLE_BUFFER_DEBUGGINGprivate: friend const void* asio::detail::buffer_cast_helper( const const_buffer& b); friend std::size_t asio::detail::buffer_size_helper( const const_buffer& b); const void* data_; std::size_t size_;#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) boost::function<void()> debug_check_;#endif // ASIO_ENABLE_BUFFER_DEBUGGING};namespace detail {inline const void* buffer_cast_helper(const const_buffer& b){#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) if (b.size_ && b.debug_check_) b.debug_check_();#endif // ASIO_ENABLE_BUFFER_DEBUGGING return b.data_;}inline std::size_t buffer_size_helper(const const_buffer& b){ return b.size_;}} // namespace detail/// Cast a non-modifiable buffer to a specified pointer to POD type./** * @relates const_buffer */template <typename PointerToPodType>inline PointerToPodType buffer_cast(const const_buffer& b){ return static_cast<PointerToPodType>(detail::buffer_cast_helper(b));}/// Get the number of bytes in a non-modifiable buffer./** * @relates const_buffer */inline std::size_t buffer_size(const const_buffer& b){ return detail::buffer_size_helper(b);}/// Create a new non-modifiable buffer that is offset from the start of another./** * @relates const_buffer */inline const_buffer operator+(const const_buffer& b, std::size_t start){ if (start > buffer_size(b)) return const_buffer(); const char* new_data = buffer_cast<const char*>(b) + start; std::size_t new_size = buffer_size(b) - start; return const_buffer(new_data, new_size#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , b.get_debug_check()#endif // ASIO_ENABLE_BUFFER_DEBUGGING );}/// Create a new non-modifiable buffer that is offset from the start of another./** * @relates const_buffer */inline const_buffer operator+(std::size_t start, const const_buffer& b){ if (start > buffer_size(b)) return const_buffer(); const char* new_data = buffer_cast<const char*>(b) + start; std::size_t new_size = buffer_size(b) - start; return const_buffer(new_data, new_size#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , b.get_debug_check()#endif // ASIO_ENABLE_BUFFER_DEBUGGING );}/// Adapts a single non-modifiable buffer so that it meets the requirements of/// the ConstBufferSequence concept.class const_buffers_1 : public const_buffer{public: /// The type for each element in the list of buffers. typedef const_buffer value_type; /// A random-access iterator type that may be used to read elements. typedef const const_buffer* const_iterator; /// Construct to represent a single non-modifiable buffer. explicit const_buffers_1(const const_buffer& b) : const_buffer(b) { } /// Get a random-access iterator to the first element. const_iterator begin() const { return this; } /// Get a random-access iterator for one past the last element. const_iterator end() const { return begin() + 1; }};#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)namespace detail {template <typename Iterator>class buffer_debug_check{public: buffer_debug_check(Iterator iter) : iter_(iter) { } ~buffer_debug_check() { iter_ = Iterator(); } void operator()() { *iter_;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -