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_IPP 11 : #define BOOST_HTTP_PROTO_IMPL_CONTEXT_IPP 12 : 13 : #include <boost/http_proto/context.hpp> 14 : #include <boost/http_proto/detail/except.hpp> 15 : //#include <boost/unordered_map.hpp> // doesn't support heterogenous lookup yet 16 : #include <unordered_map> 17 : 18 : namespace boost { 19 : namespace http_proto { 20 : 21 : struct context::data 22 : { 23 : // Installed services 24 : std::unordered_map< 25 : detail::type_index, 26 : std::unique_ptr<service> 27 : > services; 28 : }; 29 : 30 : //------------------------------------------------ 31 : 32 32 : context:: 33 32 : ~context() 34 : { 35 32 : } 36 : 37 32 : context:: 38 32 : context() 39 32 : : p_(new data) 40 : { 41 32 : } 42 : 43 : //------------------------------------------------ 44 : 45 : auto 46 822 : context:: 47 : find_service_impl( 48 : detail::type_index id) const noexcept -> 49 : service* 50 : { 51 822 : auto it = p_->services.find(id); 52 822 : if(it != p_->services.end()) 53 791 : return it->second.get(); 54 31 : return nullptr; 55 : } 56 : 57 : auto 58 31 : context:: 59 : make_service_impl( 60 : detail::type_index id, 61 : std::unique_ptr<service> sp) -> 62 : service& 63 : { 64 : auto const result = 65 31 : p_->services.emplace( 66 31 : id, std::move(sp)); 67 31 : if(! result.second) 68 : { 69 : // already exists 70 0 : detail::throw_out_of_range(); 71 : } 72 62 : return *result.first->second; 73 : } 74 : 75 : } // http_proto 76 : } // boost 77 : 78 : #endif