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 17 namespace asio { 18 namespace detail { 19 20 template <typename Service, typename Arg> 21 service_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 32 template <typename Service> 33 Service& service_registry::first_service() 34 { 35 return *static_cast<Service*>(first_service_); 36 } 37 38 template <typename Service> 39 Service& 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 47 template <typename Service> 48 void 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 55 template <typename Service> 56 bool 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) 64 template <typename Service> 65 void 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 73 template <typename Service> 74 asio::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