Socket: Remove \fixme item fixed in previous commit
[senf.git] / Socket / ClientSocketHandle.hh
index 0cca5f2..2c951b7 100644 (file)
@@ -30,6 +30,8 @@
 // Custom includes
 #include <boost/call_traits.hpp>
 #include <boost/range.hpp>
+#include <boost/utility.hpp>
+#include <boost/type_traits.hpp>
 #include "SocketHandle.hh"
 
 //#include "ClientSocketHandle.mpp"
@@ -46,20 +48,23 @@ namespace senf {
 
         This class provides the client side policy interface of the socket
         abstraction. ClientSocketHandle defines the complete policy interface. It does not implement
-        any functionality itself however. All calls are forward to the following policy classes:
+        any functionality itself however. The following table shows, to which policy members each
+        group of ClientSocketHandle members is forwardd. The last collumn shows, on which other
+        policies this member-group depends <em>in the default policy classes</em>. If you define
+        your own policy classes, the dependencies are up to you.
 
         <table class="senf">
-        <tr><th>ClientSocketHandle member</th> <th>Policy member</th></tr>
-        <tr><td>read()</td>       <td>ReadPolicy::read (\ref senf::ReadPolicyBase)</td></tr>
-        <tr><td>readfrom()</td>   <td>ReadPolicy::readfrom (\ref senf::ReadPolicyBase)</td></tr>
-        <tr><td>write()</td>      <td>WritePolicy::write (\ref senf::WritePolicyBase)</td></tr>
-        <tr><td>writeto()</td>    <td>WritePolicy::writeto (\ref senf::WritePolicyBase)</td></tr>
-        <tr><td>connect()</td>    <td>AddressingPolicy::connect (\ref senf::AddressingPolicyBase)</td></tr>
-        <tr><td>bind()</td>       <td>AddressingPolicy::bind (\ref senf::AddressingPolicyBase)</td></tr>
-        <tr><td>peer()</td>       <td>AddressingPolicy::peer (\ref senf::AddressingPolicyBase)</td></tr>
-        <tr><td>local()</td>      <td>AddressingPolicy::local (\ref senf::AddressingPolicyBase)</td></tr>
-        <tr><td>rcvbuf()</td>     <td>BufferingPolicy::sndbuf (\ref senf::BufferingPolicyBase)</td></tr>
-        <tr><td>sndbuf()</td>     <td>BufferingPolicy::rcvbuf (\ref senf::BufferingPolicyBase)</td></tr>
+        <tr><th>ClientSocketHandle member</th> <th>Policy member</th> <th>Other policies</th></tr>
+        <tr><td>read()</td>       <td>ReadPolicy::read (\ref senf::ReadPolicyBase)</td>                  <td></td></tr>
+        <tr><td>readfrom()</td>   <td>ReadPolicy::readfrom (\ref senf::ReadPolicyBase)</td>              <td>UnconnectedCommunicationPolicy</td></tr>
+        <tr><td>write()</td>      <td>WritePolicy::write (\ref senf::WritePolicyBase)</td>               <td>ConnectedCommunicationPolicy</td></tr>
+        <tr><td>writeto()</td>    <td>WritePolicy::writeto (\ref senf::WritePolicyBase)</td>             <td>UnconnectedCommunicationPolicy</td></tr>
+        <tr><td>connect()</td>    <td>AddressingPolicy::connect (\ref senf::AddressingPolicyBase)</td>   <td></td></tr>
+        <tr><td>bind()</td>       <td>AddressingPolicy::bind (\ref senf::AddressingPolicyBase)</td>      <td></td></tr>
+        <tr><td>peer()</td>       <td>AddressingPolicy::peer (\ref senf::AddressingPolicyBase)</td>      <td></td></tr>
+        <tr><td>local()</td>      <td>AddressingPolicy::local (\ref senf::AddressingPolicyBase)</td>     <td></td></tr>
+        <tr><td>rcvbuf()</td>     <td>BufferingPolicy::sndbuf (\ref senf::BufferingPolicyBase)</td>      <td></td></tr>
+        <tr><td>sndbuf()</td>     <td>BufferingPolicy::rcvbuf (\ref senf::BufferingPolicyBase)</td>      <td></td></tr>
         </table>
 
         It is important to note, that not all members are always accessible. Which are depends on
@@ -81,10 +86,6 @@ namespace senf {
 
         \see \ref policy_group \n
              \ref protocol_group
-
-        \fixme Add enable_if conditions so anything convertible to unsigned will not be interpreted
-            as a Range template argument but will use the unsigned variant of
-            read/readfrom/write/writeto.
       */
     template <class Policy>
     class ClientSocketHandle
@@ -170,7 +171,8 @@ namespace senf {
         std::string  read         (unsigned limit=0);
         template <class ForwardWritableRange>
         typename boost::range_iterator<ForwardWritableRange>::type
-                     read         (ForwardWritableRange const & range);
+                     read         (ForwardWritableRange const & range,
+                                   typename boost::disable_if< boost::is_convertible<ForwardWritableRange,unsigned> >::type * = 0);
                                         ///< Read data into range
                                         /**< Read data into the given range. At most
                                              <tt>boost::size(range)</tt> characters are read. The
@@ -185,7 +187,8 @@ namespace senf {
                                                   <a href="http://www.boost.org/libs/range/index.html">Boost.Range</a> */
         template <class ForwardWritableRange>
         typename boost::range_iterator<ForwardWritableRange>::type
-                     read         (ForwardWritableRange & range);
+                     read         (ForwardWritableRange & range,
+                                   typename boost::disable_if< boost::is_convertible<ForwardWritableRange,unsigned> >::type * = 0);
                                         ///< Read data into range
                                         /**< \see read(ForwardWritableRange const &) \n
                                                   read() \n
@@ -452,4 +455,5 @@ namespace senf {
 // indent-tabs-mode: nil
 // ispell-local-dictionary: "american"
 // compile-command: "scons -u test"
+// comment-column: 40
 // End: