Chris@16: // Chris@16: // detail/impl/service_registry.hpp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP Chris@16: #define BOOST_ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: service_registry::service_registry( Chris@16: boost::asio::io_service& o, Service*, Arg arg) Chris@16: : owner_(o), Chris@16: first_service_(new Service(o, arg)) Chris@16: { Chris@16: boost::asio::io_service::service::key key; Chris@16: init_key(key, Service::id); Chris@16: first_service_->key_ = key; Chris@16: first_service_->next_ = 0; Chris@16: } Chris@16: Chris@16: template Chris@16: Service& service_registry::first_service() Chris@16: { Chris@16: return *static_cast(first_service_); Chris@16: } Chris@16: Chris@16: template Chris@16: Service& service_registry::use_service() Chris@16: { Chris@16: boost::asio::io_service::service::key key; Chris@16: init_key(key, Service::id); Chris@16: factory_type factory = &service_registry::create; Chris@16: return *static_cast(do_use_service(key, factory)); Chris@16: } Chris@16: Chris@16: template Chris@16: void service_registry::add_service(Service* new_service) Chris@16: { Chris@16: boost::asio::io_service::service::key key; Chris@16: init_key(key, Service::id); Chris@16: return do_add_service(key, new_service); Chris@16: } Chris@16: Chris@16: template Chris@16: bool service_registry::has_service() const Chris@16: { Chris@16: boost::asio::io_service::service::key key; Chris@16: init_key(key, Service::id); Chris@16: return do_has_service(key); Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_ASIO_NO_TYPEID) Chris@16: template Chris@16: void service_registry::init_key(boost::asio::io_service::service::key& key, Chris@16: const boost::asio::detail::service_id& /*id*/) Chris@16: { Chris@16: key.type_info_ = &typeid(typeid_wrapper); Chris@16: key.id_ = 0; Chris@16: } Chris@16: #endif // !defined(BOOST_ASIO_NO_TYPEID) Chris@16: Chris@16: template Chris@16: boost::asio::io_service::service* service_registry::create( Chris@16: boost::asio::io_service& owner) Chris@16: { Chris@16: return new Service(owner); Chris@16: } Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP