summaryrefslogtreecommitdiff
path: root/boost/asio/detail/impl/service_registry.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:11:01 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:11:01 +0900
commit3fdc3e5ee96dca5b11d1694975a65200787eab86 (patch)
tree5c1733853892b8397d67706fa453a9bd978d2102 /boost/asio/detail/impl/service_registry.hpp
parent88e602c57797660ebe0f9e15dbd64c1ff16dead3 (diff)
downloadboost-3fdc3e5ee96dca5b11d1694975a65200787eab86.tar.gz
boost-3fdc3e5ee96dca5b11d1694975a65200787eab86.tar.bz2
boost-3fdc3e5ee96dca5b11d1694975a65200787eab86.zip
Imported Upstream version 1.66.0upstream/1.66.0
Diffstat (limited to 'boost/asio/detail/impl/service_registry.hpp')
-rw-r--r--boost/asio/detail/impl/service_registry.hpp64
1 files changed, 35 insertions, 29 deletions
diff --git a/boost/asio/detail/impl/service_registry.hpp b/boost/asio/detail/impl/service_registry.hpp
index 7ffdd029f7..11ad4cf5cc 100644
--- a/boost/asio/detail/impl/service_registry.hpp
+++ b/boost/asio/detail/impl/service_registry.hpp
@@ -21,64 +21,70 @@ namespace boost {
namespace asio {
namespace detail {
-template <typename Service, typename Arg>
-service_registry::service_registry(
- boost::asio::io_service& o, Service*, Arg arg)
- : owner_(o),
- first_service_(new Service(o, arg))
-{
- boost::asio::io_service::service::key key;
- init_key(key, Service::id);
- first_service_->key_ = key;
- first_service_->next_ = 0;
-}
-
template <typename Service>
-Service& service_registry::first_service()
+Service& service_registry::use_service()
{
- return *static_cast<Service*>(first_service_);
+ execution_context::service::key key;
+ init_key<Service>(key, 0);
+ factory_type factory = &service_registry::create<Service, execution_context>;
+ return *static_cast<Service*>(do_use_service(key, factory, &owner_));
}
template <typename Service>
-Service& service_registry::use_service()
+Service& service_registry::use_service(io_context& owner)
{
- boost::asio::io_service::service::key key;
- init_key(key, Service::id);
- factory_type factory = &service_registry::create<Service>;
- return *static_cast<Service*>(do_use_service(key, factory));
+ execution_context::service::key key;
+ init_key<Service>(key, 0);
+ factory_type factory = &service_registry::create<Service, io_context>;
+ return *static_cast<Service*>(do_use_service(key, factory, &owner));
}
template <typename Service>
void service_registry::add_service(Service* new_service)
{
- boost::asio::io_service::service::key key;
- init_key(key, Service::id);
+ execution_context::service::key key;
+ init_key<Service>(key, 0);
return do_add_service(key, new_service);
}
template <typename Service>
bool service_registry::has_service() const
{
- boost::asio::io_service::service::key key;
- init_key(key, Service::id);
+ execution_context::service::key key;
+ init_key<Service>(key, 0);
return do_has_service(key);
}
+template <typename Service>
+inline void service_registry::init_key(
+ execution_context::service::key& key, ...)
+{
+ init_key_from_id(key, Service::id);
+}
+
#if !defined(BOOST_ASIO_NO_TYPEID)
template <typename Service>
-void service_registry::init_key(boost::asio::io_service::service::key& key,
- const boost::asio::detail::service_id<Service>& /*id*/)
+void service_registry::init_key(execution_context::service::key& key,
+ typename enable_if<
+ is_base_of<typename Service::key_type, Service>::value>::type*)
{
key.type_info_ = &typeid(typeid_wrapper<Service>);
key.id_ = 0;
}
-#endif // !defined(BOOST_ASIO_NO_TYPEID)
template <typename Service>
-boost::asio::io_service::service* service_registry::create(
- boost::asio::io_service& owner)
+void service_registry::init_key_from_id(execution_context::service::key& key,
+ const service_id<Service>& /*id*/)
+{
+ key.type_info_ = &typeid(typeid_wrapper<Service>);
+ key.id_ = 0;
+}
+#endif // !defined(BOOST_ASIO_NO_TYPEID)
+
+template <typename Service, typename Owner>
+execution_context::service* service_registry::create(void* owner)
{
- return new Service(owner);
+ return new Service(*static_cast<Owner*>(owner));
}
} // namespace detail