Home | History | Annotate | Download | only in impl
      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