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