Home | History | Annotate | Download | only in asio
      1 //
      2 // handler_type.hpp
      3 // ~~~~~~~~~~~~~~~~
      4 //
      5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
      6 //
      7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
      8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
      9 //
     10 
     11 #ifndef ASIO_HANDLER_TYPE_HPP
     12 #define ASIO_HANDLER_TYPE_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 
     17 #include "asio/detail/push_options.hpp"
     18 
     19 namespace asio {
     20 
     21 /// Default handler type traits provided for all handlers.
     22 /**
     23  * The handler_type traits class is used for determining the concrete handler
     24  * type to be used for an asynchronous operation. It allows the handler type to
     25  * be determined at the point where the specific completion handler signature
     26  * is known.
     27  *
     28  * This template may be specialised for user-defined handler types.
     29  */
     30 template <typename Handler, typename Signature>
     31 struct handler_type
     32 {
     33   /// The handler type for the specific signature.
     34   typedef Handler type;
     35 };
     36 
     37 
     38 template <typename Handler, typename Signature>
     39 struct handler_type<const Handler, Signature>
     40   : handler_type<Handler, Signature> {};
     41 
     42 template <typename Handler, typename Signature>
     43 struct handler_type<volatile Handler, Signature>
     44   : handler_type<Handler, Signature> {};
     45 
     46 template <typename Handler, typename Signature>
     47 struct handler_type<const volatile Handler, Signature>
     48   : handler_type<Handler, Signature> {};
     49 
     50 template <typename Handler, typename Signature>
     51 struct handler_type<const Handler&, Signature>
     52   : handler_type<Handler, Signature> {};
     53 
     54 template <typename Handler, typename Signature>
     55 struct handler_type<volatile Handler&, Signature>
     56   : handler_type<Handler, Signature> {};
     57 
     58 template <typename Handler, typename Signature>
     59 struct handler_type<const volatile Handler&, Signature>
     60   : handler_type<Handler, Signature> {};
     61 
     62 template <typename Handler, typename Signature>
     63 struct handler_type<Handler&, Signature>
     64   : handler_type<Handler, Signature> {};
     65 
     66 template <typename Handler, typename Signature>
     67 struct handler_type<Handler&&, Signature>
     68   : handler_type<Handler, Signature> {};
     69 
     70 template <typename ReturnType, typename Signature>
     71 struct handler_type<ReturnType(), Signature>
     72   : handler_type<ReturnType(*)(), Signature> {};
     73 
     74 template <typename ReturnType, typename Arg1, typename Signature>
     75 struct handler_type<ReturnType(Arg1), Signature>
     76   : handler_type<ReturnType(*)(Arg1), Signature> {};
     77 
     78 template <typename ReturnType, typename Arg1, typename Arg2, typename Signature>
     79 struct handler_type<ReturnType(Arg1, Arg2), Signature>
     80   : handler_type<ReturnType(*)(Arg1, Arg2), Signature> {};
     81 
     82 template <typename ReturnType, typename Arg1, typename Arg2, typename Arg3,
     83     typename Signature>
     84 struct handler_type<ReturnType(Arg1, Arg2, Arg3), Signature>
     85   : handler_type<ReturnType(*)(Arg1, Arg2, Arg3), Signature> {};
     86 
     87 template <typename ReturnType, typename Arg1, typename Arg2, typename Arg3,
     88     typename Arg4, typename Signature>
     89 struct handler_type<ReturnType(Arg1, Arg2, Arg3, Arg4), Signature>
     90   : handler_type<ReturnType(*)(Arg1, Arg2, Arg3, Arg4), Signature> {};
     91 
     92 template <typename ReturnType, typename Arg1, typename Arg2, typename Arg3,
     93     typename Arg4, typename Arg5, typename Signature>
     94 struct handler_type<ReturnType(Arg1, Arg2, Arg3, Arg4, Arg5), Signature>
     95   : handler_type<ReturnType(*)(Arg1, Arg2, Arg3, Arg4, Arg5), Signature> {};
     96 
     97 
     98 } // namespace asio
     99 
    100 #include "asio/detail/pop_options.hpp"
    101 
    102 #define ASIO_HANDLER_TYPE(h, sig)    typename handler_type<h, sig>::type
    103 
    104 #endif // ASIO_HANDLER_TYPE_HPP
    105