⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffer.hpp

📁 这是国外的resip协议栈
💻 HPP
📖 第 1 页 / 共 2 页
字号:
//// 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 + -