basic_socket_iostream.hpp
Go to the documentation of this file.
00001 //
00002 // basic_socket_iostream.hpp
00003 // ~~~~~~~~~~~~~~~~~~~~~~~~~
00004 //
00005 // Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
00006 //
00007 // Distributed under the Boost Software License, Version 1.0. (See accompanying
00008 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
00009 //
00010 
00011 #ifndef ASIO_BASIC_SOCKET_IOSTREAM_HPP
00012 #define ASIO_BASIC_SOCKET_IOSTREAM_HPP
00013 
00014 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
00015 # pragma once
00016 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
00017 
00018 #include "asio/detail/push_options.hpp"
00019 
00020 #include "asio/detail/push_options.hpp"
00021 #include <boost/preprocessor/arithmetic/inc.hpp>
00022 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
00023 #include <boost/preprocessor/repetition/enum_params.hpp>
00024 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
00025 #include <boost/utility/base_from_member.hpp>
00026 #include "asio/detail/pop_options.hpp"
00027 
00028 #include "asio/basic_socket_streambuf.hpp"
00029 #include "asio/stream_socket_service.hpp"
00030 
00031 #if !defined(ASIO_SOCKET_IOSTREAM_MAX_ARITY)
00032 #define ASIO_SOCKET_IOSTREAM_MAX_ARITY 5
00033 #endif // !defined(ASIO_SOCKET_IOSTREAM_MAX_ARITY)
00034 
00035 // A macro that should expand to:
00036 //   template <typename T1, ..., typename Tn>
00037 //   explicit basic_socket_iostream(T1 x1, ..., Tn xn)
00038 //     : basic_iostream<char>(&this->boost::base_from_member<
00039 //         basic_socket_streambuf<Protocol, StreamSocketService> >::member)
00040 //   {
00041 //     if (rdbuf()->connect(x1, ..., xn) == 0)
00042 //       this->setstate(std::ios_base::failbit);
00043 //   }
00044 // This macro should only persist within this file.
00045 
00046 #define ASIO_PRIVATE_CTR_DEF(z, n, data) \
00047   template <BOOST_PP_ENUM_PARAMS(n, typename T)> \
00048   explicit basic_socket_iostream(BOOST_PP_ENUM_BINARY_PARAMS(n, T, x)) \
00049     : std::basic_iostream<char>(&this->boost::base_from_member< \
00050         basic_socket_streambuf<Protocol, StreamSocketService> >::member) \
00051   { \
00052     tie(this); \
00053     if (rdbuf()->connect(BOOST_PP_ENUM_PARAMS(n, x)) == 0) \
00054       this->setstate(std::ios_base::failbit); \
00055   } \
00056   
00057 
00058 // A macro that should expand to:
00059 //   template <typename T1, ..., typename Tn>
00060 //   void connect(T1 x1, ..., Tn xn)
00061 //   {
00062 //     if (rdbuf()->connect(x1, ..., xn) == 0)
00063 //       this->setstate(std::ios_base::failbit);
00064 //   }
00065 // This macro should only persist within this file.
00066 
00067 #define ASIO_PRIVATE_CONNECT_DEF(z, n, data) \
00068   template <BOOST_PP_ENUM_PARAMS(n, typename T)> \
00069   void connect(BOOST_PP_ENUM_BINARY_PARAMS(n, T, x)) \
00070   { \
00071     if (rdbuf()->connect(BOOST_PP_ENUM_PARAMS(n, x)) == 0) \
00072       this->setstate(std::ios_base::failbit); \
00073   } \
00074   
00075 
00076 namespace asio {
00077 
00079 template <typename Protocol,
00080     typename StreamSocketService = stream_socket_service<Protocol> >
00081 class basic_socket_iostream
00082   : public boost::base_from_member<
00083       basic_socket_streambuf<Protocol, StreamSocketService> >,
00084     public std::basic_iostream<char>
00085 {
00086 public:
00088   basic_socket_iostream()
00089     : std::basic_iostream<char>(&this->boost::base_from_member<
00090         basic_socket_streambuf<Protocol, StreamSocketService> >::member)
00091   {
00092     tie(this);
00093   }
00094 
00095 #if defined(GENERATING_DOCUMENTATION)
00096 
00097 
00102   template <typename T1, ..., typename TN>
00103   explicit basic_socket_iostream(T1 t1, ..., TN tn);
00104 #else
00105   BOOST_PP_REPEAT_FROM_TO(
00106       1, BOOST_PP_INC(ASIO_SOCKET_IOSTREAM_MAX_ARITY),
00107       ASIO_PRIVATE_CTR_DEF, _ )
00108 #endif
00109 
00110 #if defined(GENERATING_DOCUMENTATION)
00111 
00112 
00117   template <typename T1, ..., typename TN>
00118   void connect(T1 t1, ..., TN tn);
00119 #else
00120   BOOST_PP_REPEAT_FROM_TO(
00121       1, BOOST_PP_INC(ASIO_SOCKET_IOSTREAM_MAX_ARITY),
00122       ASIO_PRIVATE_CONNECT_DEF, _ )
00123 #endif
00124 
00126   void close()
00127   {
00128     if (rdbuf()->close() == 0)
00129       this->setstate(std::ios_base::failbit);
00130   }
00131 
00133   basic_socket_streambuf<Protocol, StreamSocketService>* rdbuf() const
00134   {
00135     return const_cast<basic_socket_streambuf<Protocol, StreamSocketService>*>(
00136         &this->boost::base_from_member<
00137           basic_socket_streambuf<Protocol, StreamSocketService> >::member);
00138   }
00139 };
00140 
00141 } // namespace asio
00142 
00143 #undef ASIO_PRIVATE_CTR_DEF
00144 #undef ASIO_PRIVATE_CONNECT_DEF
00145 
00146 #include "asio/detail/pop_options.hpp"
00147 
00148 #endif // ASIO_BASIC_SOCKET_IOSTREAM_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines


Castor
Author(s): Carpe Noctem
autogenerated on Fri Nov 8 2013 11:05:39