// // Copyright (c) 2012-2020 Kanstantsin Chernik // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "boost/di/extension/injections/extensible_injector.hpp" #include #include namespace di = boost::di; struct interface { virtual ~interface() noexcept = default; virtual int num() = 0; }; struct any { virtual ~any() noexcept = default; }; struct object : any {}; struct implementation1 : interface { int num() override { return 1; } }; struct implementation2 : interface { int num() override { return 2; } }; struct implementation3 : interface { int num() override { return 3; } }; struct example { example(std::unique_ptr i, std::shared_ptr im3) : i_(std::move(i)), im3_(im3) {} std::shared_ptr i_; std::shared_ptr im3_; }; int main() { //<> auto im3_orig = std::make_shared(); //<> // clang-format off auto orig_injector = di::make_injector( //<> di::bind().to().in(di::unique) //<> , di::bind().to() //<> , di::bind().to()[di::override] //<> , di::bind().to(im3_orig) ); { //<> auto extended_injector = di::make_injector( //<> di::extension::make_extensible(orig_injector) //<> , di::bind().to().in(di::unique)[di::override] ); // clang-format on //<> auto orig_example = orig_injector.create(); assert(1 == orig_example.i_->num()); assert(3 == orig_example.im3_->num()); auto extended_example = extended_injector.create(); assert(2 == extended_example.i_->num()); assert(3 == extended_example.im3_->num()); //<> assert(extended_example.im3_ == orig_example.im3_); assert(im3_orig == orig_example.im3_); //<> assert(orig_injector.create>() == orig_injector.create>()); } //<> assert(im3_orig == orig_injector.create>()); { //<> auto empty_injector = di::make_injector(); auto empty_extended_injector = di::make_injector(di::extension::make_extensible(empty_injector)); auto instance = empty_extended_injector.create(); assert(1 == instance.num()); } }