//
// deprecated_async_ops.hpp
// ~~~~~~~~~~~~~~~~~~~~~~~~
//
// Copyright (c) 2003-2015 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 ARCHETYPES_DEPRECATED_ASYNC_OPS_HPP
#define ARCHETYPES_DEPRECATED_ASYNC_OPS_HPP

#include <asio/async_result.hpp>

#if !defined(ASIO_NO_DEPRECATED)

#include <asio/handler_type.hpp>
#include <asio/error.hpp>
#include <asio/io_context.hpp>

#if defined(ASIO_HAS_BOOST_BIND)
# include <boost/bind.hpp>
#else // defined(ASIO_HAS_BOOST_BIND)
# include <functional>
#endif // defined(ASIO_HAS_BOOST_BIND)

namespace archetypes {

#if defined(ASIO_HAS_BOOST_BIND)
namespace bindns = boost;
#else // defined(ASIO_HAS_BOOST_BIND)
namespace bindns = std;
#endif // defined(ASIO_HAS_BOOST_BIND)

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void()>::type>::type
deprecated_async_op_0(asio::io_context& ctx,
    ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void()>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler)));

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(asio::error_code)>::type>::type
deprecated_async_op_ec_0(asio::io_context& ctx,
    bool ok, ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(asio::error_code)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  if (ok)
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          asio::error_code()));
  }
  else
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          asio::error_code(asio::error::operation_aborted)));
  }

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(std::exception_ptr)>::type>::type
deprecated_async_op_ex_0(asio::io_context& ctx,
    bool ok, ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(std::exception_ptr)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  if (ok)
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          std::exception_ptr()));
  }
  else
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          std::make_exception_ptr(std::runtime_error("blah"))));
  }

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(int)>::type>::type
deprecated_async_op_1(asio::io_context& ctx,
    ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(int)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler), 42));

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(asio::error_code, int)>::type>::type
deprecated_async_op_ec_1(asio::io_context& ctx,
    bool ok, ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(asio::error_code, int)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  if (ok)
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          asio::error_code(), 42));
  }
  else
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          asio::error_code(asio::error::operation_aborted), 0));
  }

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(std::exception_ptr, int)>::type>::type
deprecated_async_op_ex_1(asio::io_context& ctx,
    bool ok, ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(std::exception_ptr, int)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  if (ok)
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          std::exception_ptr(), 42));
  }
  else
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          std::make_exception_ptr(std::runtime_error("blah")), 0));
  }

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(int, double)>::type>::type
deprecated_async_op_2(asio::io_context& ctx,
    ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(int, double)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
        42, 2.0));

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(asio::error_code, int, double)>::type>::type
deprecated_async_op_ec_2(asio::io_context& ctx,
    bool ok, ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(asio::error_code, int, double)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  if (ok)
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          asio::error_code(), 42, 2.0));
  }
  else
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          asio::error_code(asio::error::operation_aborted),
          0, 0.0));
  }

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(std::exception_ptr, int, double)>::type>::type
deprecated_async_op_ex_2(asio::io_context& ctx,
    bool ok, ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(std::exception_ptr, int, double)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  if (ok)
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          std::exception_ptr(), 42, 2.0));
  }
  else
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          std::make_exception_ptr(std::runtime_error("blah")), 0, 0.0));
  }

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(int, double, char)>::type>::type
deprecated_async_op_3(asio::io_context& ctx,
    ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(int, double, char)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
        42, 2.0, 'a'));

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(asio::error_code, int, double, char)>::type>::type
deprecated_async_op_ec_3(asio::io_context& ctx,
    bool ok, ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(asio::error_code, int, double, char)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  if (ok)
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          asio::error_code(), 42, 2.0, 'a'));
  }
  else
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          asio::error_code(asio::error::operation_aborted),
          0, 0.0, 'z'));
  }

  return result.get();
}

template <typename CompletionToken>
typename asio::async_result<
  typename asio::handler_type<CompletionToken,
    void(std::exception_ptr, int, double, char)>::type>::type
deprecated_async_op_ex_3(asio::io_context& ctx,
    bool ok, ASIO_MOVE_ARG(CompletionToken) token)
{
  typedef typename asio::handler_type<CompletionToken,
    void(std::exception_ptr, int, double, char)>::type handler_type;

  handler_type handler(ASIO_MOVE_CAST(CompletionToken)(token));

  asio::async_result<handler_type> result(handler);

  if (ok)
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          std::exception_ptr(), 42, 2.0, 'a'));
  }
  else
  {
    ctx.post(bindns::bind(ASIO_MOVE_CAST(handler_type)(handler),
          std::make_exception_ptr(std::runtime_error("blah")),
          0, 0.0, 'z'));
  }

  return result.get();
}

} // namespace archetypes

#endif // !defined(ASIO_NO_DEPRECATED)

#endif // ARCHETYPES_DEPRECATED_ASYNC_OPS_HPP
