LCOV - code coverage report
Current view: top level - http_proto/impl - context.hpp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 8 9 88.9 %
Date: 2023-01-09 16:11:12 Functions: 3 4 75.0 %

          Line data    Source code
       1             : //
       2             : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
       3             : //
       4             : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5             : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6             : //
       7             : // Official repository: https://github.com/CPPAlliance/http_proto
       8             : //
       9             : 
      10             : #ifndef BOOST_HTTP_PROTO_IMPL_CONTEXT_HPP
      11             : #define BOOST_HTTP_PROTO_IMPL_CONTEXT_HPP
      12             : 
      13             : #include <boost/http_proto/detail/except.hpp>
      14             : #include <boost/mp11/utility.hpp>
      15             : #include <utility>
      16             : 
      17             : namespace boost {
      18             : namespace http_proto {
      19             : 
      20             : namespace detail {
      21             : 
      22             : template<class T>
      23             : using get_key_impl =
      24             :     typename T::key_type;
      25             : 
      26             : template<class T>
      27             : using get_key_type =
      28             :     mp11::mp_eval_or<T, get_key_impl, T>;
      29             : 
      30             : } // detail
      31             : 
      32             : //------------------------------------------------
      33             : 
      34             : template<class T, class... Args>
      35             : T&
      36           7 : context::
      37             : make_service(
      38             :     Args&&... args)
      39             : {
      40             :     auto const ti = detail::get_type_index<
      41           7 :         detail::get_key_type<T>>();
      42           7 :     auto const ps = find_service_impl(ti);
      43           7 :     if(ps)
      44           0 :         detail::throw_invalid_argument(
      45             :             "service exists");
      46          14 :     return static_cast<T&>(
      47             :         make_service_impl(ti,
      48           5 :             std::unique_ptr<service>(
      49           7 :                 new T(*this, std::forward<
      50          14 :                     Args>(args)...))));
      51             : }
      52             : 
      53             : template<class T>
      54             : T*
      55             : context::
      56             : find_service() const noexcept
      57             : {
      58             :     auto const ti = detail::get_type_index<
      59             :         detail::get_key_type<T>>();
      60             :     auto const ps = find_service_impl(ti);
      61             :     if(! ps)
      62             :         return nullptr;
      63             :     return dynamic_cast<T*>(ps);
      64             : }
      65             : 
      66             : template<class T>
      67             : bool
      68             : context::
      69             : has_service() const noexcept
      70             : {
      71             :     return find_service<T>() != nullptr;
      72             : }
      73             : 
      74             : template<class T>
      75             : T&
      76             : context::
      77             : get_service() const
      78             : {
      79             :     auto ps = find_service<T>();
      80             :     if(! ps)
      81             :         detail::throw_invalid_argument(
      82             :             "service not found");
      83             :     return *ps;
      84             : }
      85             : 
      86             : } // http_proto
      87             : } // boost
      88             : 
      89             : #endif

Generated by: LCOV version 1.15