1//
2// detail/impl/service_registry.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_DETAIL_IMPL_SERVICE_REGISTRY_HPP
12#define ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP
13
14
15#include "asio/detail/push_options.hpp"
16
17namespace asio {
18namespace detail {
19
20template <typename Service, typename Arg>
21service_registry::service_registry(
22    asio::io_service& o, Service*, Arg arg)
23  : owner_(o),
24    first_service_(new Service(o, arg))
25{
26  asio::io_service::service::key key;
27  init_key(key, Service::id);
28  first_service_->key_ = key;
29  first_service_->next_ = 0;
30}
31
32template <typename Service>
33Service& service_registry::first_service()
34{
35  return *static_cast<Service*>(first_service_);
36}
37
38template <typename Service>
39Service& service_registry::use_service()
40{
41  asio::io_service::service::key key;
42  init_key(key, Service::id);
43  factory_type factory = &service_registry::create<Service>;
44  return *static_cast<Service*>(do_use_service(key, factory));
45}
46
47template <typename Service>
48void service_registry::add_service(Service* new_service)
49{
50  asio::io_service::service::key key;
51  init_key(key, Service::id);
52  return do_add_service(key, new_service);
53}
54
55template <typename Service>
56bool service_registry::has_service() const
57{
58  asio::io_service::service::key key;
59  init_key(key, Service::id);
60  return do_has_service(key);
61}
62
63#if !defined(ASIO_NO_TYPEID)
64template <typename Service>
65void service_registry::init_key(asio::io_service::service::key& key,
66    const asio::detail::service_id<Service>& /*id*/)
67{
68  key.type_info_ = &typeid(typeid_wrapper<Service>);
69  key.id_ = 0;
70}
71#endif // !defined(ASIO_NO_TYPEID)
72
73template <typename Service>
74asio::io_service::service* service_registry::create(
75    asio::io_service& owner)
76{
77  return new Service(owner);
78}
79
80} // namespace detail
81} // namespace asio
82
83#include "asio/detail/pop_options.hpp"
84
85#endif // ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP
86