From 40c828455d094854d9e531fc7dd0d1a0244957b7 Mon Sep 17 00:00:00 2001 From: HampusM Date: Tue, 29 Mar 2022 19:29:08 +0200 Subject: refactor: make container use concepts --- src/DI/container.tpp | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) (limited to 'src/DI/container.tpp') diff --git a/src/DI/container.tpp b/src/DI/container.tpp index 2573223..54b09c6 100644 --- a/src/DI/container.tpp +++ b/src/DI/container.tpp @@ -7,42 +7,49 @@ #include -template +template BindingBuilder::BindingBuilder(Container *container) noexcept : _container(container) { } -template -template +template +template +requires std::derived_from void BindingBuilder::to() noexcept { - _container->bindings.emplace( - ObjectType(), - std::dynamic_pointer_cast( - std::make_shared>(*_container))); + using Wrapper = ObjectWrapper; + + auto wrapper = Container::Ptr(new Wrapper(*_container)); + + _container->add(ObjectType(), + std::dynamic_pointer_cast(wrapper)); } -template +template void BindingBuilder::to_factory(Interface func) noexcept { - _container->bindings.emplace(ObjectType(), - std::dynamic_pointer_cast( - std::make_shared>(func))); + using Wrapper = FunctionWrapper; + + auto wrapper = Container::Ptr(new Wrapper(func)); + + _container->add(ObjectType(), + std::dynamic_pointer_cast(wrapper)); } -template +template auto Container::bind() noexcept -> BindingBuilder { return BindingBuilder(this); } -template -auto Container::get() const noexcept -> std::shared_ptr +template +requires Abstract +auto Container::get() const noexcept -> Ptr { ObjectType interface_type; - if (bindings.count(interface_type) == 0) + if (_bindings.count(interface_type) == 0) { std::cerr << "Error: Tried to get a item from the container using unbound interface '" @@ -50,17 +57,18 @@ auto Container::get() const noexcept -> std::shared_ptr exit(EXIT_FAILURE); } - auto wrapper = std::dynamic_pointer_cast>>( - bindings.at(interface_type)); + auto wrapper = + std::dynamic_pointer_cast>>(_bindings.at(interface_type)); return wrapper->get(); } -template +template +requires Function auto Container::get() const noexcept -> Interface { auto wrapper = std::dynamic_pointer_cast>( - bindings.at(ObjectType())); + _bindings.at(ObjectType())); return wrapper->get(); } -- cgit v1.2.3-18-g5258