From ad37253c1e84658c2b80d14d667c72406561f829 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Sat, 6 Apr 2024 18:14:45 +0200 Subject: [PATCH 01/19] add code coverage --- .github/workflows/CodeCoverage.yml | 32 ++++++++++++++++++++++++++++++ .github/workflows/DevCI.yml | 4 +--- .github/workflows/Linux.yml | 4 +--- .github/workflows/MacOs.yml | 4 +--- .github/workflows/Windows.yml | 4 +--- 5 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/CodeCoverage.yml diff --git a/.github/workflows/CodeCoverage.yml b/.github/workflows/CodeCoverage.yml new file mode 100644 index 0000000..c395b4b --- /dev/null +++ b/.github/workflows/CodeCoverage.yml @@ -0,0 +1,32 @@ +name: Code Coverage + +on: + push: + branches: [ "dev", "main" ] + paths-ignore: + - "Docs/**" + - ".readthedocs.yaml" + - "README.md" + +jobs: + code-coverage: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Create Build Environment + run: cmake -E make_directory ${{runner.workspace}}/build + + - name: Configure + run: cmake -B ${{runner.workspace}}/build -D_7BIT_DI_LIBRARY_TYPE=Static -D_7BIT_DI_BUILD_ALL_TESTS=ON -DCMAKE_CXX_FLAGS="-coverage" + + - name: Build + run: cmake --build ${{runner.workspace}}/build -j + + - name: Test + working-directory: ${{runner.workspace}}/build + run: ctest --output-on-failure + + - working-directory: ${{runner.workspace}}/build + run: bash <(curl -s https://codecov.io/bash) diff --git a/.github/workflows/DevCI.yml b/.github/workflows/DevCI.yml index 4bcd698..378cf39 100644 --- a/.github/workflows/DevCI.yml +++ b/.github/workflows/DevCI.yml @@ -36,6 +36,4 @@ jobs: - name: Test working-directory: ${{runner.workspace}}/build - run: ctest -C ${{matrix.build_type}} - env: - CTEST_OUTPUT_ON_FAILURE: True + run: ctest -C ${{matrix.build_type}} --output-on-failure diff --git a/.github/workflows/Linux.yml b/.github/workflows/Linux.yml index 30598f2..82f8a63 100644 --- a/.github/workflows/Linux.yml +++ b/.github/workflows/Linux.yml @@ -82,6 +82,4 @@ jobs: - name: Test working-directory: ${{runner.workspace}}/build - run: ctest -C ${{matrix.build_type}} - env: - CTEST_OUTPUT_ON_FAILURE: True + run: ctest -C ${{matrix.build_type}} --output-on-failure diff --git a/.github/workflows/MacOs.yml b/.github/workflows/MacOs.yml index 8c2da18..1091706 100644 --- a/.github/workflows/MacOs.yml +++ b/.github/workflows/MacOs.yml @@ -54,6 +54,4 @@ jobs: - name: Test working-directory: ${{runner.workspace}}/build - run: ctest -C ${{matrix.build_type}} - env: - CTEST_OUTPUT_ON_FAILURE: True + run: ctest -C ${{matrix.build_type}} --output-on-failure diff --git a/.github/workflows/Windows.yml b/.github/workflows/Windows.yml index f2c578f..1aff30c 100644 --- a/.github/workflows/Windows.yml +++ b/.github/workflows/Windows.yml @@ -80,6 +80,4 @@ jobs: - name: Test working-directory: ${{runner.workspace}}/build - run: ctest -C ${{matrix.build_type}} - env: - CTEST_OUTPUT_ON_FAILURE: True + run: ctest -C ${{matrix.build_type}} --output-on-failure From 5709c89d80dbf5df51ae8207961410206a1b2d16 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Sat, 6 Apr 2024 18:45:49 +0200 Subject: [PATCH 02/19] update code coverage --- .github/workflows/CodeCoverage.yml | 5 +++-- README.md | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CodeCoverage.yml b/.github/workflows/CodeCoverage.yml index c395b4b..0f0248f 100644 --- a/.github/workflows/CodeCoverage.yml +++ b/.github/workflows/CodeCoverage.yml @@ -28,5 +28,6 @@ jobs: working-directory: ${{runner.workspace}}/build run: ctest --output-on-failure - - working-directory: ${{runner.workspace}}/build - run: bash <(curl -s https://codecov.io/bash) + - name: Upload Code Coverage + working-directory: ${{runner.workspace}}/build + run: bash <(curl -s https://codecov.io/bash) -t ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md index c2a2df3..59a9e2d 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Windows](https://github.com/7bitcoder/7bitDI/actions/workflows/Windows.yml/badge.svg)](https://github.com/7bitcoder/7bitDI/actions/workflows/Windows.yml) [![MacOs](https://github.com/7bitcoder/7bitDI/actions/workflows/MacOs.yml/badge.svg)](https://github.com/7bitcoder/7bitDI/actions/workflows/MacOs.yml) [![Conan Center](https://img.shields.io/conan/v/7bitdi)](https://conan.io/center/recipes/7bitdi) +[![codecov](https://codecov.io/gh/7bitcoder/7bitDI/graph/badge.svg?token=UIC7KY8TZ3)](https://codecov.io/gh/7bitcoder/7bitDI)
From db20f32550251ef17ff9a44bfae689ae49f316f3 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Sun, 21 Apr 2024 12:29:27 +0200 Subject: [PATCH 03/19] change aliases behaviour, extend get all services --- .../Containers/Impl/ServiceInstanceList.hpp | 5 ++ .../Containers/ServiceInstanceList.hpp | 2 + .../Core/Impl/ServiceInstanceProvider.hpp | 47 +++++++++++++++---- Include/SevenBit/DI/OneOrList.hpp | 18 +++++++ Tests/Integration/AliasTest.cpp | 39 +++++++++++++++ 5 files changed, 101 insertions(+), 10 deletions(-) diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp index 8dd6d46..08ab35e 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp @@ -19,6 +19,11 @@ namespace sb::di::details _oneOrList.add(RequireInstance::validAndGet(std::move(instance))); } + INLINE void ServiceInstanceList::addRange(ServiceInstanceList &&instances) + { + _oneOrList.addRange(std::move(instances.getInnerList())); + } + INLINE OneOrList &ServiceInstanceList::getInnerList() { return _oneOrList; } INLINE const OneOrList &ServiceInstanceList::getInnerList() const { return _oneOrList; } diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp index 4044004..12eed15 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp @@ -24,6 +24,8 @@ namespace sb::di::details void add(ServiceInstance &&instance); + void addRange(ServiceInstanceList &&instances); + [[nodiscard]] auto begin() const { return _oneOrList.getAsList().begin(); } [[nodiscard]] auto end() const { return _oneOrList.getAsList().end(); } diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index d4b06af..998c2ab 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -178,9 +178,22 @@ namespace sb::di::details RequireDescriptor::nonTransient(descriptors.first()); return makeResolver(descriptors).createAllInstancesInPlace(); } - auto &last = descriptors.last(); - const auto originals = tryGetInstances(ServiceId{last.getImplementationTypeId(), last.getImplementationKey()}); - return originals ? std::make_optional(makeResolver(descriptors).createAllAliases(*originals)) : std::nullopt; + std::optional result; + descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { + const ServiceId id{aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}; + if (const auto originals = tryGetInstances(id)) + { + if (!result) + { + result = std::make_optional(makeResolver(descriptors).createAllAliases(*originals)); + } + else + { + result->addRange(makeResolver(descriptors).createAllAliases(*originals)); + } + } + }); + return result; } INLINE ServiceInstanceList *ServiceInstanceProvider::createRestNonTransientAndGet( @@ -217,13 +230,27 @@ namespace sb::di::details RequireDescriptor::transient(descriptors.first()); return std::move(makeResolver(descriptors).createAllInstances().getInnerList()); } - auto &last = descriptors.last(); - auto aliases = tryCreateInstances(ServiceId{last.getImplementationTypeId(), last.getImplementationKey()}); - if (aliases && last.getCastOffset()) - { - aliases->forEach([&](ServiceInstance &instance) { instance.addCastOffset(last.getCastOffset()); }); - } - return aliases; + std::optional> result; + descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { + const ServiceId id{aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}; + if (auto originals = tryCreateInstances(id)) + { + if (aliasDescriptor.getCastOffset()) + { + originals->forEach( + [&](ServiceInstance &instance) { instance.addCastOffset(aliasDescriptor.getCastOffset()); }); + } + if (!result) + { + result = std::move(originals); + } + else + { + result->addRange(std::move(*originals)); + } + } + }); + return result; } INLINE ServiceInstancesResolver ServiceInstanceProvider::makeResolver(const ServiceDescriptorList &descriptors) diff --git a/Include/SevenBit/DI/OneOrList.hpp b/Include/SevenBit/DI/OneOrList.hpp index d00d91a..79950e9 100644 --- a/Include/SevenBit/DI/OneOrList.hpp +++ b/Include/SevenBit/DI/OneOrList.hpp @@ -47,6 +47,24 @@ namespace sb::di getAsList().emplace_back(std::move(element)); } + void addRange(OneOrList &&other) + { + tryConvertToList(); + auto &thisList = getAsList(); + if (auto list = other.tryGetAsList()) + { + thisList.reserve(thisList.size() + list->size()); + for (auto &element : *list) + { + thisList.emplace_back(std::move(element)); + } + } + else + { + thisList.emplace_back(std::move(other.getAsSingle())); + } + } + T &first() { auto single = tryGetAsSingle(); diff --git a/Tests/Integration/AliasTest.cpp b/Tests/Integration/AliasTest.cpp index c11d43d..286368d 100644 --- a/Tests/Integration/AliasTest.cpp +++ b/Tests/Integration/AliasTest.cpp @@ -210,6 +210,26 @@ TEST_F(AliasTest, ShouldGetServices) EXPECT_TRUE(provider.getServices().empty()); } +TEST_F(AliasTest, ShouldGetMultipleServices) +{ + auto provider = sb::di::ServiceCollection{} + .addSingleton() + .addSingleton() + .addAlias() + .addAlias() + .addAlias() + .addAlias() + .buildServiceProvider(); + + const auto services = provider.getServices(); + + EXPECT_EQ(services.size(), 3); + EXPECT_EQ(services[0]->first(), 4); + EXPECT_EQ(services[1]->first(), 3); + EXPECT_EQ(services[2]->first(), 4); + EXPECT_EQ(services[2], services[0]); +} + TEST_F(AliasTest, ShoulNotGetServices) { auto provider = sb::di::ServiceCollection{} @@ -369,6 +389,25 @@ TEST_F(AliasTest, ShouldCreateServices) EXPECT_TRUE(provider.createServices().empty()); } +TEST_F(AliasTest, ShouldCreateMultipleServices) +{ + auto provider = sb::di::ServiceCollection{} + .addTransient() + .addTransient() + .addAlias() + .addAlias() + .addAlias() + .addAlias() + .buildServiceProvider(); + + const auto services = provider.createServices(); + + EXPECT_EQ(services.size(), 3); + EXPECT_EQ(services[0]->first(), 4); + EXPECT_EQ(services[1]->first(), 3); + EXPECT_EQ(services[2]->first(), 4); +} + TEST_F(AliasTest, ShoulNotCreateServices) { auto provider = sb::di::ServiceCollection{} From f7e073f0c86445123808f73e55d351da252bc8be Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Sun, 21 Apr 2024 14:11:25 +0200 Subject: [PATCH 04/19] update code --- .../Core/Impl/ServiceInstanceProvider.hpp | 28 +++++++++---------- .../Details/Core/ServiceInstanceProvider.hpp | 2 +- Tests/Helpers/Classes/Legion.hpp | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index 998c2ab..c31587c 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -67,7 +67,7 @@ namespace sb::di::details { if (const auto descriptors = findDescriptors(id, false)) { - instances = createRestNonTransientAndGet(*descriptors, *instances); + instances = createRestNonTransient(*descriptors, *instances); } } return instances ? &instances->getInnerList() : nullptr; @@ -166,7 +166,7 @@ namespace sb::di::details return makeResolver(descriptors).createOneInstanceInPlace(); } auto &last = descriptors.last(); - const auto original = tryGetInstance(ServiceId{last.getImplementationTypeId(), last.getImplementationKey()}); + const auto original = tryGetInstance({last.getImplementationTypeId(), last.getImplementationKey()}); return original ? std::make_optional(makeResolver(descriptors).createOneAlias(*original)) : std::nullopt; } @@ -179,9 +179,8 @@ namespace sb::di::details return makeResolver(descriptors).createAllInstancesInPlace(); } std::optional result; - descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { - const ServiceId id{aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}; - if (const auto originals = tryGetInstances(id)) + descriptors.getInnerList().forEach([&](const ServiceDescriptor &alias) { + if (const auto originals = tryGetInstances({alias.getImplementationTypeId(), alias.getImplementationKey()})) { if (!result) { @@ -196,7 +195,7 @@ namespace sb::di::details return result; } - INLINE ServiceInstanceList *ServiceInstanceProvider::createRestNonTransientAndGet( + INLINE ServiceInstanceList *ServiceInstanceProvider::createRestNonTransient( const ServiceDescriptorList &descriptors, ServiceInstanceList &instances) { if (!descriptors.isAlias()) @@ -205,7 +204,7 @@ namespace sb::di::details return &makeResolver(descriptors).createRestInstancesInPlace(instances); } auto &last = descriptors.last(); - const auto originals = tryGetInstances(ServiceId{last.getImplementationTypeId(), last.getImplementationKey()}); + const auto originals = tryGetInstances({last.getImplementationTypeId(), last.getImplementationKey()}); return originals ? &makeResolver(descriptors).createRestAliases(*originals, instances) : nullptr; } @@ -217,9 +216,9 @@ namespace sb::di::details return makeResolver(descriptors).createInstance(); } auto &last = descriptors.last(); - auto alias = tryCreateInstance(ServiceId{last.getImplementationTypeId(), last.getImplementationKey()}); - alias.addCastOffset(last.getCastOffset()); - return alias; + auto original = tryCreateInstance({last.getImplementationTypeId(), last.getImplementationKey()}); + original.addCastOffset(last.getCastOffset()); + return original; } INLINE std::optional> ServiceInstanceProvider::tryCreateAllTransient( @@ -231,14 +230,13 @@ namespace sb::di::details return std::move(makeResolver(descriptors).createAllInstances().getInnerList()); } std::optional> result; - descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { - const ServiceId id{aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}; - if (auto originals = tryCreateInstances(id)) + descriptors.getInnerList().forEach([&](const ServiceDescriptor &alias) { + if (auto originals = tryCreateInstances({alias.getImplementationTypeId(), alias.getImplementationKey()})) { - if (aliasDescriptor.getCastOffset()) + if (alias.getCastOffset()) { originals->forEach( - [&](ServiceInstance &instance) { instance.addCastOffset(aliasDescriptor.getCastOffset()); }); + [&](ServiceInstance &instance) { instance.addCastOffset(alias.getCastOffset()); }); } if (!result) { diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index 73370a2..7a65427 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -136,7 +136,7 @@ namespace sb::di::details std::optional tryCreateNonTransient(const ServiceDescriptorList &descriptors); std::optional tryCreateAllNonTransient(const ServiceDescriptorList &descriptors); - ServiceInstanceList *createRestNonTransientAndGet(const ServiceDescriptorList &descriptors, + ServiceInstanceList *createRestNonTransient(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); ServiceInstance tryCreateTransient(const ServiceDescriptorList &descriptors); diff --git a/Tests/Helpers/Classes/Legion.hpp b/Tests/Helpers/Classes/Legion.hpp index 525d21e..4bf3815 100644 --- a/Tests/Helpers/Classes/Legion.hpp +++ b/Tests/Helpers/Classes/Legion.hpp @@ -4,7 +4,7 @@ template class Legion { - int data[25] = {0}; // 100b + char data[100] = {0}; // 100b public: Legion() = default; From 475a3be99ff3e264d1b1fb2ad5f4dc3a2f616562 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Sun, 21 Apr 2024 19:47:16 +0200 Subject: [PATCH 05/19] update alias code --- .../Containers/Impl/ServiceInstanceList.hpp | 7 +- .../Containers/ServiceInstanceList.hpp | 3 + .../Impl/ServiceAliasInstancesResolver.hpp | 82 ++++++ .../Core/Impl/ServiceInstanceProvider.hpp | 73 ++--- .../Core/Impl/ServiceInstancesResolver.hpp | 88 +----- .../Core/ServiceAliasInstancesResolver.hpp | 102 +++++++ .../Details/Core/ServiceInstanceProvider.hpp | 4 +- .../Details/Core/ServiceInstancesResolver.hpp | 32 +-- .../Unit/Core/ServiceInstanceResolverTest.cpp | 268 +++++++++--------- 9 files changed, 384 insertions(+), 275 deletions(-) create mode 100644 Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp create mode 100644 Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp index 08ab35e..0ffd7de 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp @@ -21,7 +21,12 @@ namespace sb::di::details INLINE void ServiceInstanceList::addRange(ServiceInstanceList &&instances) { - _oneOrList.addRange(std::move(instances.getInnerList())); + addRange(std::move(instances.getInnerList())); + } + + INLINE void ServiceInstanceList::addRange(OneOrList &&instances) + { + _oneOrList.addRange(std::move(instances)); } INLINE OneOrList &ServiceInstanceList::getInnerList() { return _oneOrList; } diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp index 12eed15..6fa49f0 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp @@ -16,6 +16,8 @@ namespace sb::di::details explicit ServiceInstanceList(ServiceInstance instance); explicit ServiceInstanceList(std::size_t size); + explicit ServiceInstanceList(OneOrList &&other) : _oneOrList(std::move(other)) {} + ServiceInstanceList(const ServiceInstanceList &) = delete; ServiceInstanceList(ServiceInstanceList &&) = default; @@ -25,6 +27,7 @@ namespace sb::di::details void add(ServiceInstance &&instance); void addRange(ServiceInstanceList &&instances); + void addRange(OneOrList &&instances); [[nodiscard]] auto begin() const { return _oneOrList.getAsList().begin(); } [[nodiscard]] auto end() const { return _oneOrList.getAsList().end(); } diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp new file mode 100644 index 0000000..eabe2e5 --- /dev/null +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp @@ -0,0 +1,82 @@ +#pragma once + +#include +#include + +#include "SevenBit/DI/LibraryConfig.hpp" + +#include "SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp" + +namespace sb::di::details +{ + INLINE ServiceAliasInstancesResolver::ServiceAliasInstancesResolver(ServiceInstanceCreator &creator, + const ServiceDescriptorList &descriptors) + : _creator(creator), _descriptors(descriptors) + { + } + + INLINE std::optional ServiceAliasInstancesResolver::createOne(const ServiceInstance *original) const + { + return original ? std::make_optional(ServiceInstanceList{create(_descriptors.last(), *original)}) : std::nullopt; + } + + INLINE ServiceInstance ServiceAliasInstancesResolver::map( ServiceInstance &&original) const{ + original.addCastOffset(_descriptors.last().getCastOffset()); + return std::move(original); + } + + INLINE ServiceInstance ServiceAliasInstancesResolver::create(const ServiceDescriptor& descriptor, const ServiceInstance &original) const + { + return _creator.createInstanceAlias(descriptor, original); + } + + INLINE void ServiceAliasInstancesResolver::createAll(const ServiceDescriptor &descriptor, const OneOrList &originals, + std::optional &instances) const + { + if (instances) + { + instances->reserve(instances->size() + originals.size()); + } + originals.forEach([&](const ServiceInstance &instance) { + if (!instances) + { + instances = ServiceInstanceList{create(descriptor, instance)}; + instances->reserve(originals.size()); + } + else + { + instances->add(create(descriptor, instance)); + } + }); + } + + INLINE void ServiceAliasInstancesResolver::createAll( + const ServiceDescriptor &descriptor, const OneOrList &originals, + ServiceInstanceList &instances) const + { + instances.reserve(instances.size() + originals.size()); + originals.forEach([&](const ServiceInstance &instance) { + instances.add(create(descriptor, instance)); + }); + } + + INLINE void ServiceAliasInstancesResolver::createRest( + const ServiceDescriptor &descriptor, const OneOrList &originals, + ServiceInstanceList &instances) const + { + if (const auto size = originals.size(); size > 1) + { + instances.reserve(instances.size()+ size); + auto first = create(descriptor, originals.first()); + originals.forEach([&](const ServiceInstance &instance, const std::size_t index) { + if (index && index < size - 1) // skip first and last + { + instances.add(create(descriptor, instance)); + } + }); + instances.add(std::move(first)); + std::swap(instances.first(), instances.last()); + } + instances.seal(); + } +} // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index c31587c..15274ac 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -111,7 +111,7 @@ namespace sb::di::details if (const auto descriptors = findDescriptors(id, true); descriptors && !descriptors->isAlias() && descriptors->last().getImplementationTypeId() == id.getTypeId()) { - return makeResolver(*descriptors).createInstanceInPlace(); + return makeResolver(*descriptors).createInPlace(); } return ServiceInstance{}; } @@ -163,11 +163,11 @@ namespace sb::di::details if (!descriptors.isAlias()) { RequireDescriptor::nonTransient(descriptors.first()); - return makeResolver(descriptors).createOneInstanceInPlace(); + return makeResolver(descriptors).createOneInPlace(); } auto &last = descriptors.last(); - const auto original = tryGetInstance({last.getImplementationTypeId(), last.getImplementationKey()}); - return original ? std::make_optional(makeResolver(descriptors).createOneAlias(*original)) : std::nullopt; + return makeAliasResolver(descriptors) + .createOne(tryGetInstance({last.getImplementationTypeId(), last.getImplementationKey()})); } INLINE std::optional ServiceInstanceProvider::tryCreateAllNonTransient( @@ -176,23 +176,11 @@ namespace sb::di::details if (!descriptors.isAlias()) { RequireDescriptor::nonTransient(descriptors.first()); - return makeResolver(descriptors).createAllInstancesInPlace(); + return makeResolver(descriptors).createAllInPlace(); } - std::optional result; - descriptors.getInnerList().forEach([&](const ServiceDescriptor &alias) { - if (const auto originals = tryGetInstances({alias.getImplementationTypeId(), alias.getImplementationKey()})) - { - if (!result) - { - result = std::make_optional(makeResolver(descriptors).createAllAliases(*originals)); - } - else - { - result->addRange(makeResolver(descriptors).createAllAliases(*originals)); - } - } + return makeAliasResolver(descriptors).createAll([&](const ServiceDescriptor &aliasDescriptor) { + return tryGetInstances({aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}); }); - return result; } INLINE ServiceInstanceList *ServiceInstanceProvider::createRestNonTransient( @@ -201,11 +189,12 @@ namespace sb::di::details if (!descriptors.isAlias()) { RequireDescriptor::nonTransient(descriptors.first()); - return &makeResolver(descriptors).createRestInstancesInPlace(instances); + return &makeResolver(descriptors).createRestInPlace(instances); } - auto &last = descriptors.last(); - const auto originals = tryGetInstances({last.getImplementationTypeId(), last.getImplementationKey()}); - return originals ? &makeResolver(descriptors).createRestAliases(*originals, instances) : nullptr; + makeAliasResolver(descriptors).createRest(instances, [&](const ServiceDescriptor &aliasDescriptor) { + return tryGetInstances({aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}); + }); + return &instances; } INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransient(const ServiceDescriptorList &descriptors) @@ -213,12 +202,11 @@ namespace sb::di::details if (!descriptors.isAlias()) { RequireDescriptor::transient(descriptors.first()); - return makeResolver(descriptors).createInstance(); + return makeResolver(descriptors).create(); } auto &last = descriptors.last(); - auto original = tryCreateInstance({last.getImplementationTypeId(), last.getImplementationKey()}); - original.addCastOffset(last.getCastOffset()); - return original; + return makeAliasResolver(descriptors) + .map(tryCreateInstance({last.getImplementationTypeId(), last.getImplementationKey()})); } INLINE std::optional> ServiceInstanceProvider::tryCreateAllTransient( @@ -227,28 +215,12 @@ namespace sb::di::details if (!descriptors.isAlias()) { RequireDescriptor::transient(descriptors.first()); - return std::move(makeResolver(descriptors).createAllInstances().getInnerList()); + return std::move(makeResolver(descriptors).createAll().getInnerList()); } - std::optional> result; - descriptors.getInnerList().forEach([&](const ServiceDescriptor &alias) { - if (auto originals = tryCreateInstances({alias.getImplementationTypeId(), alias.getImplementationKey()})) - { - if (alias.getCastOffset()) - { - originals->forEach( - [&](ServiceInstance &instance) { instance.addCastOffset(alias.getCastOffset()); }); - } - if (!result) - { - result = std::move(originals); - } - else - { - result->addRange(std::move(*originals)); - } - } + return makeAliasResolver(descriptors).mapAll([&](const ServiceDescriptor &aliasDescriptor) { + return tryCreateInstances( + {aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}); }); - return result; } INLINE ServiceInstancesResolver ServiceInstanceProvider::makeResolver(const ServiceDescriptorList &descriptors) @@ -256,4 +228,11 @@ namespace sb::di::details auto &creator = descriptors.getLifeTime().isSingleton() ? _root.getRootInstanceCreator() : getInstanceCreator(); return ServiceInstancesResolver{creator, descriptors}; } + + INLINE ServiceAliasInstancesResolver + ServiceInstanceProvider::makeAliasResolver(const ServiceDescriptorList &descriptors) + { + auto &creator = descriptors.getLifeTime().isSingleton() ? _root.getRootInstanceCreator() : getInstanceCreator(); + return ServiceAliasInstancesResolver{creator, descriptors}; + } } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp index d91e7c2..72cefa9 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp @@ -15,92 +15,34 @@ namespace sb::di::details { } - INLINE ServiceInstance ServiceInstancesResolver::createInstance() const { return createInstance(false); } + INLINE ServiceInstance ServiceInstancesResolver::create() const { return create(false); } - INLINE ServiceInstanceList ServiceInstancesResolver::createOneInstance() const { return createOneInstance(false); } + INLINE ServiceInstanceList ServiceInstancesResolver::createOne() const { return createOne(false); } - INLINE ServiceInstanceList ServiceInstancesResolver::createAllInstances() const - { - return createAllInstances(false); - } - - INLINE ServiceInstanceList &ServiceInstancesResolver::createRestInstances(ServiceInstanceList &instances) const - { - return createRestInstances(instances, false); - } + INLINE ServiceInstanceList ServiceInstancesResolver::createAll() const { return createAll(false); } - INLINE ServiceInstance ServiceInstancesResolver::createInstanceInPlace() const { return createInstance(true); } - - INLINE ServiceInstanceList ServiceInstancesResolver::createOneInstanceInPlace() const + INLINE ServiceInstanceList &ServiceInstancesResolver::createRest(ServiceInstanceList &instances) const { - return createOneInstance(true); + return createRest(instances, false); } - INLINE ServiceInstanceList ServiceInstancesResolver::createAllInstancesInPlace() const - { - return createAllInstances(true); - } + INLINE ServiceInstance ServiceInstancesResolver::createInPlace() const { return create(true); } - INLINE ServiceInstanceList &ServiceInstancesResolver::createRestInstancesInPlace( - ServiceInstanceList &instances) const - { - return createRestInstances(instances, true); - } + INLINE ServiceInstanceList ServiceInstancesResolver::createOneInPlace() const { return createOne(true); } - INLINE ServiceInstance ServiceInstancesResolver::createAlias(const ServiceInstance &original) const - { - return _creator.createInstanceAlias(_descriptors.last(), original); - } - - INLINE ServiceInstanceList ServiceInstancesResolver::createOneAlias(const ServiceInstance &original) const - { - return ServiceInstanceList{createAlias(original)}; - } - - INLINE ServiceInstanceList - ServiceInstancesResolver::createAllAliases(const OneOrList &originals) const - { - ServiceInstanceList instances{createAlias(originals.first())}; - if (const auto size = originals.size(); size > 1) - { - instances.reserve(size); - originals.forEach([&](const ServiceInstance &instance, const std::size_t index) { - if (index) // skip first - { - instances.add(createAlias(instance)); - } - }); - } - instances.seal(); - return instances; - } + INLINE ServiceInstanceList ServiceInstancesResolver::createAllInPlace() const { return createAll(true); } - INLINE ServiceInstanceList &ServiceInstancesResolver::createRestAliases(const OneOrList &originals, - ServiceInstanceList &instances) const + INLINE ServiceInstanceList &ServiceInstancesResolver::createRestInPlace(ServiceInstanceList &instances) const { - if (const auto size = originals.size(); size > 1) - { - instances.reserve(size); - auto first = createAlias(originals.first()); - originals.forEach([&](const ServiceInstance &instance, const std::size_t index) { - if (index && index < size - 1) // skip first and last - { - instances.add(createAlias(instance)); - } - }); - instances.add(std::move(first)); - std::swap(instances.first(), instances.last()); - } - instances.seal(); - return instances; + return createRest(instances, true); } - INLINE ServiceInstance ServiceInstancesResolver::createInstance(const bool inPlaceRequest) const + INLINE ServiceInstance ServiceInstancesResolver::create(const bool inPlaceRequest) const { return _creator.createInstance(_descriptors.last(), inPlaceRequest); } - INLINE ServiceInstanceList ServiceInstancesResolver::createOneInstance(const bool inPlaceRequest) const + INLINE ServiceInstanceList ServiceInstancesResolver::createOne(const bool inPlaceRequest) const { ServiceInstanceList instances{_creator.createInstance(_descriptors.last(), inPlaceRequest)}; if (_descriptors.size() == 1) @@ -110,7 +52,7 @@ namespace sb::di::details return instances; } - INLINE ServiceInstanceList ServiceInstancesResolver::createAllInstances(const bool inPlaceRequest) const + INLINE ServiceInstanceList ServiceInstancesResolver::createAll(const bool inPlaceRequest) const { ServiceInstanceList instances{_creator.createInstance(_descriptors.first(), inPlaceRequest)}; if (const auto size = _descriptors.size(); size > 1) @@ -127,8 +69,8 @@ namespace sb::di::details return instances; } - INLINE ServiceInstanceList &ServiceInstancesResolver::createRestInstances(ServiceInstanceList &instances, - const bool inPlaceRequest) const + INLINE ServiceInstanceList &ServiceInstancesResolver::createRest(ServiceInstanceList &instances, + const bool inPlaceRequest) const { if (const auto size = _descriptors.size(); size > 1) { diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp new file mode 100644 index 0000000..6a5b1db --- /dev/null +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp @@ -0,0 +1,102 @@ +#pragma once + +#include "SevenBit/DI/LibraryConfig.hpp" + +#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" +#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" +#include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" + +namespace sb::di::details +{ + class EXPORT ServiceAliasInstancesResolver + { + ServiceInstanceCreator &_creator; + const ServiceDescriptorList &_descriptors; + + public: + ServiceAliasInstancesResolver(ServiceInstanceCreator &creator, const ServiceDescriptorList &descriptors); + + [[nodiscard]] std::optional createOne(const ServiceInstance *original) const; + + template std::optional createAll(TFactory originalFactory) const + { + std::optional result; + _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { + if (const OneOrList *originals = originalFactory(aliasDescriptor)) + { + createAll(aliasDescriptor, *originals, result); + } + }); + if (result) + { + result->seal(); + } + return result; + } + + template + ServiceInstanceList &createRest(ServiceInstanceList &instances, TFactory originalFactory) const + { + const auto size = _descriptors.size(); + _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { + if (const OneOrList *originals = originalFactory(aliasDescriptor)) + { + if (index < size - 1) // not last + { + createAll(aliasDescriptor, *originals, instances); + } + else + { + createRest(aliasDescriptor, *originals, instances); + } + } + }); + instances.seal(); + return instances; + } + + [[nodiscard]] ServiceInstance map(ServiceInstance &&original) const; + + template std::optional> mapAll(TFactory originalFactory) const + { + std::optional> result; + _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { + if (std::optional> originals = originalFactory(aliasDescriptor)) + { + if (aliasDescriptor.getCastOffset()) + { + originals->forEach([&](ServiceInstance &instance) { + instance.addCastOffset(aliasDescriptor.getCastOffset()); + }); + } + if (!result) + { + result = std::move(originals); + } + else + { + result->addRange(std::move(*originals)); + } + } + }); + return result; + } + + private: + [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, + const ServiceInstance &original) const; + + void createAll(const ServiceDescriptor &descriptor, const OneOrList &originals, + std::optional &instances) const; + + void createAll(const ServiceDescriptor &descriptor, const OneOrList &originals, + ServiceInstanceList &instances) const; + + void createRest(const ServiceDescriptor &descriptor, const OneOrList &originals, + ServiceInstanceList &instances) const; + }; +} // namespace sb::di::details + +#ifdef _7BIT_DI_ADD_IMPL +#include "SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp" +#endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index 7a65427..c1458ac 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -8,6 +8,7 @@ #include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" #include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" #include "SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp" +#include "SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp" #include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" #include "SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp" #include "SevenBit/DI/IServiceInstanceProvider.hpp" @@ -137,12 +138,13 @@ namespace sb::di::details std::optional tryCreateNonTransient(const ServiceDescriptorList &descriptors); std::optional tryCreateAllNonTransient(const ServiceDescriptorList &descriptors); ServiceInstanceList *createRestNonTransient(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances); + ServiceInstanceList &instances); ServiceInstance tryCreateTransient(const ServiceDescriptorList &descriptors); std::optional> tryCreateAllTransient(const ServiceDescriptorList &descriptors); ServiceInstancesResolver makeResolver(const ServiceDescriptorList &descriptors); + ServiceAliasInstancesResolver makeAliasResolver(const ServiceDescriptorList &descriptors); ServiceInstanceCreator &getInstanceCreator() { return _instanceCreator; } }; diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp index ce707c9..96b1f63 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp @@ -16,27 +16,21 @@ namespace sb::di::details public: ServiceInstancesResolver(ServiceInstanceCreator &creator, const ServiceDescriptorList &descriptors); - [[nodiscard]] ServiceInstance createInstance() const; - [[nodiscard]] ServiceInstanceList createOneInstance() const; - [[nodiscard]] ServiceInstanceList createAllInstances() const; - ServiceInstanceList &createRestInstances(ServiceInstanceList &instances) const; - - [[nodiscard]] ServiceInstance createInstanceInPlace() const; - [[nodiscard]] ServiceInstanceList createOneInstanceInPlace() const; - [[nodiscard]] ServiceInstanceList createAllInstancesInPlace() const; - ServiceInstanceList &createRestInstancesInPlace(ServiceInstanceList &instances) const; - - [[nodiscard]] ServiceInstance createAlias(const ServiceInstance &original) const; - [[nodiscard]] ServiceInstanceList createOneAlias(const ServiceInstance &original) const; - [[nodiscard]] ServiceInstanceList createAllAliases(const OneOrList &originals) const; - [[nodiscard]] ServiceInstanceList &createRestAliases(const OneOrList &originals, - ServiceInstanceList &instances) const; + [[nodiscard]] ServiceInstance create() const; + [[nodiscard]] ServiceInstanceList createOne() const; + [[nodiscard]] ServiceInstanceList createAll() const; + ServiceInstanceList &createRest(ServiceInstanceList &instances) const; + + [[nodiscard]] ServiceInstance createInPlace() const; + [[nodiscard]] ServiceInstanceList createOneInPlace() const; + [[nodiscard]] ServiceInstanceList createAllInPlace() const; + ServiceInstanceList &createRestInPlace(ServiceInstanceList &instances) const; private: - [[nodiscard]] ServiceInstance createInstance(bool inPlaceRequest) const; - [[nodiscard]] ServiceInstanceList createOneInstance(bool inPlaceRequest) const; - [[nodiscard]] ServiceInstanceList createAllInstances(bool inPlaceRequest) const; - ServiceInstanceList &createRestInstances(ServiceInstanceList &instances, bool inPlaceRequest) const; + [[nodiscard]] ServiceInstance create(bool inPlaceRequest) const; + [[nodiscard]] ServiceInstanceList createOne(bool inPlaceRequest) const; + [[nodiscard]] ServiceInstanceList createAll(bool inPlaceRequest) const; + ServiceInstanceList &createRest(ServiceInstanceList &instances, bool inPlaceRequest) const; }; } // namespace sb::di::details diff --git a/Tests/Unit/Core/ServiceInstanceResolverTest.cpp b/Tests/Unit/Core/ServiceInstanceResolverTest.cpp index e6296a2..cf3fb39 100644 --- a/Tests/Unit/Core/ServiceInstanceResolverTest.cpp +++ b/Tests/Unit/Core/ServiceInstanceResolverTest.cpp @@ -32,7 +32,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateInstance) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instance = resolver.createInstance(); + const auto instance = resolver.create(); EXPECT_TRUE(instance); EXPECT_TRUE(instance.isValid()); @@ -52,7 +52,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateInheritedInstance) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instance = resolver.createInstance(); + const auto instance = resolver.create(); EXPECT_TRUE(instance); EXPECT_TRUE(instance.isValid()); @@ -69,7 +69,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInstance) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instances = resolver.createOneInstance(); + const auto instances = resolver.createOne(); EXPECT_EQ(instances.size(), 1); EXPECT_TRUE(instances.isSealed()); @@ -90,7 +90,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInheritedInstance) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instances = resolver.createOneInstance(); + const auto instances = resolver.createOne(); EXPECT_EQ(instances.size(), 1); EXPECT_FALSE(instances.isSealed()); @@ -108,7 +108,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInstances) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instances = resolver.createAllInstances(); + const auto instances = resolver.createAll(); EXPECT_EQ(instances.size(), 1); EXPECT_TRUE(instances.isSealed()); @@ -129,7 +129,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInheritedInstances) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instances = resolver.createAllInstances(); + const auto instances = resolver.createAll(); EXPECT_EQ(instances.size(), 3); EXPECT_TRUE(instances.isSealed()); @@ -158,7 +158,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstances) sb::di::details::ServiceInstanceList instances{ sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, false)}}; - resolver.createRestInstances(instances); + resolver.createRest(instances); EXPECT_EQ(instances.size(), 3); EXPECT_TRUE(instances.isSealed()); @@ -182,7 +182,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateInstanceInPlace) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instance = resolver.createInstanceInPlace(); + const auto instance = resolver.createInPlace(); EXPECT_TRUE(instance); EXPECT_TRUE(instance.isValid()); @@ -202,7 +202,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateInheritedInstanceInPlace) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instance = resolver.createInstanceInPlace(); + const auto instance = resolver.createInPlace(); EXPECT_TRUE(instance); EXPECT_TRUE(instance.isValid()); @@ -219,7 +219,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInstanceInPlace) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instances = resolver.createOneInstanceInPlace(); + const auto instances = resolver.createOneInPlace(); EXPECT_EQ(instances.size(), 1); EXPECT_TRUE(instances.isSealed()); @@ -240,7 +240,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInheritedInstanceInPlace) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instances = resolver.createOneInstanceInPlace(); + const auto instances = resolver.createOneInPlace(); EXPECT_EQ(instances.size(), 1); EXPECT_FALSE(instances.isSealed()); @@ -258,7 +258,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInstancesInPlace) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instances = resolver.createAllInstancesInPlace(); + const auto instances = resolver.createAllInPlace(); EXPECT_EQ(instances.size(), 1); EXPECT_TRUE(instances.isSealed()); @@ -279,7 +279,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInheritedInstancesInPlace) const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - const auto instances = resolver.createAllInstancesInPlace(); + const auto instances = resolver.createAllInPlace(); EXPECT_EQ(instances.size(), 3); EXPECT_TRUE(instances.isSealed()); @@ -308,7 +308,7 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstancesInPlace) sb::di::details::ServiceInstanceList instances{ sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, true)}}; - resolver.createRestInstancesInPlace(instances); + resolver.createRestInPlace(instances); EXPECT_EQ(instances.size(), 3); EXPECT_TRUE(instances.isSealed()); @@ -323,123 +323,123 @@ TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstancesInPlace) EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); } -TEST_F(ServiceInstanceResolverTest, ShouldCreateAlias) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeAlias()}; - descriptors.add(sb::di::ServiceDescriber::describeAlias()); - descriptors.add(sb::di::ServiceDescriber::describeAlias()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - TestInheritClass6 test; - const sb::di::ServiceInstance external{ - std::make_unique>(&test)}; - - const auto instance = resolver.createAlias(external); - - EXPECT_TRUE(instance); - EXPECT_TRUE(instance.isValid()); - EXPECT_TRUE(instance.getAs()); - EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateOneAlias) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeAlias()}; - descriptors.add(sb::di::ServiceDescriber::describeAlias()); - descriptors.add(sb::di::ServiceDescriber::describeAlias()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - TestInheritClass6 test; - sb::di::ServiceInstance external{std::make_unique>(&test)}; - - const auto instances = resolver.createOneAlias(external); - - EXPECT_EQ(instances.size(), 1); - EXPECT_FALSE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateAllAliases) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeAlias()}; - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - TestInheritClass3 test3; - TestInheritClass4 test4; - TestInheritClass5 test5; - sb::di::details::ServiceInstanceList externals{ - sb::di::ServiceInstance{std::make_unique>(&test3)}}; - externals.add( - sb::di::ServiceInstance{std::make_unique>(&test4)}); - externals.add( - sb::di::ServiceInstance{std::make_unique>(&test5)}); - - const auto instances = resolver.createAllAliases(externals.getInnerList()); - - EXPECT_EQ(instances.size(), 3); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); - EXPECT_TRUE(instances.getInnerList()[1].isValid()); - EXPECT_TRUE(instances.getInnerList()[1].getAs()); - EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); - EXPECT_TRUE(instances.getInnerList()[2].isValid()); - EXPECT_TRUE(instances.getInnerList()[2].getAs()); - EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateRestAliases) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeAlias()}; - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - TestInheritClass3 test3; - TestInheritClass4 test4; - TestInheritClass5 test5; - sb::di::details::ServiceInstanceList externals{ - sb::di::ServiceInstance{std::make_unique>(&test3)}}; - externals.add( - sb::di::ServiceInstance{std::make_unique>(&test4)}); - externals.add( - sb::di::ServiceInstance{std::make_unique>(&test5)}); - - sb::di::details::ServiceInstanceList instances{ - sb::di::ServiceInstance{std::make_unique>(&test5)}}; - - auto &_ = resolver.createRestAliases(externals.getInnerList(), instances); - - EXPECT_EQ(instances.size(), 3); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); - EXPECT_TRUE(instances.getInnerList()[1].isValid()); - EXPECT_TRUE(instances.getInnerList()[1].getAs()); - EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); - EXPECT_TRUE(instances.getInnerList()[2].isValid()); - EXPECT_TRUE(instances.getInnerList()[2].getAs()); - EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -} +// TEST_F(ServiceInstanceResolverTest, ShouldCreateAlias) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeAlias()}; +// descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// TestInheritClass6 test; +// const sb::di::ServiceInstance external{ +// std::make_unique>(&test)}; +// +// const auto instance = resolver.createAlias(external); +// +// EXPECT_TRUE(instance); +// EXPECT_TRUE(instance.isValid()); +// EXPECT_TRUE(instance.getAs()); +// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneAlias) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeAlias()}; +// descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// TestInheritClass6 test; +// sb::di::ServiceInstance external{std::make_unique>(&test)}; +// +// const auto instances = resolver.createOneAlias(external); +// +// EXPECT_EQ(instances.size(), 1); +// EXPECT_FALSE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllAliases) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeAlias()}; +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// TestInheritClass3 test3; +// TestInheritClass4 test4; +// TestInheritClass5 test5; +// sb::di::details::ServiceInstanceList externals{ +// sb::di::ServiceInstance{std::make_unique>(&test3)}}; +// externals.add( +// sb::di::ServiceInstance{std::make_unique>(&test4)}); +// externals.add( +// sb::di::ServiceInstance{std::make_unique>(&test5)}); +// +// const auto instances = resolver.createAllAliases(externals.getInnerList()); +// +// EXPECT_EQ(instances.size(), 3); +// EXPECT_TRUE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_TRUE(instances.getInnerList()[1].isValid()); +// EXPECT_TRUE(instances.getInnerList()[1].getAs()); +// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_TRUE(instances.getInnerList()[2].isValid()); +// EXPECT_TRUE(instances.getInnerList()[2].getAs()); +// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateRestAliases) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeAlias()}; +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// TestInheritClass3 test3; +// TestInheritClass4 test4; +// TestInheritClass5 test5; +// sb::di::details::ServiceInstanceList externals{ +// sb::di::ServiceInstance{std::make_unique>(&test3)}}; +// externals.add( +// sb::di::ServiceInstance{std::make_unique>(&test4)}); +// externals.add( +// sb::di::ServiceInstance{std::make_unique>(&test5)}); +// +// sb::di::details::ServiceInstanceList instances{ +// sb::di::ServiceInstance{std::make_unique>(&test5)}}; +// +// auto &_ = resolver.createRestAliases(externals.getInnerList(), instances); +// +// EXPECT_EQ(instances.size(), 3); +// EXPECT_TRUE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_TRUE(instances.getInnerList()[1].isValid()); +// EXPECT_TRUE(instances.getInnerList()[1].getAs()); +// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_TRUE(instances.getInnerList()[2].isValid()); +// EXPECT_TRUE(instances.getInnerList()[2].getAs()); +// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// } From f701c97b8461078817390e56ecedd01ed6a42df4 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Sun, 21 Apr 2024 23:21:50 +0200 Subject: [PATCH 06/19] update alias code --- .../Containers/Impl/ServiceInstanceList.hpp | 11 +- .../Containers/ServiceInstanceList.hpp | 9 +- .../Impl/ServiceAliasInstancesResolver.hpp | 55 +++------- .../Core/Impl/ServiceInstanceProvider.hpp | 82 +++++++------- .../Core/Impl/ServiceInstancesResolver.hpp | 16 +-- .../Core/ServiceAliasInstancesResolver.hpp | 43 +++----- .../Details/Core/ServiceInstanceProvider.hpp | 16 +-- .../SevenBit/DI/IServiceInstanceProvider.hpp | 6 +- Include/SevenBit/DI/OneOrList.hpp | 102 +++++++++++++----- Include/SevenBit/DI/ServiceProvider.hpp | 24 ++--- Source/Source.cpp | 1 + .../Mocks/ServiceInstanceProviderMock.hpp | 6 +- .../Core/ServiceInstanceProviderRootTest.cpp | 12 +-- Tests/Unit/Factories/ServiceFactoryTest.cpp | 10 +- .../Unit/Factories/ServiceFcnFactoryTest.cpp | 17 ++- Tests/Unit/Helpers/ServiceGetterTest.cpp | 2 +- 16 files changed, 202 insertions(+), 210 deletions(-) diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp index 0ffd7de..71396fe 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp @@ -19,14 +19,11 @@ namespace sb::di::details _oneOrList.add(RequireInstance::validAndGet(std::move(instance))); } - INLINE void ServiceInstanceList::addRange(ServiceInstanceList &&instances) - { - addRange(std::move(instances.getInnerList())); - } + INLINE void ServiceInstanceList::add(ServiceInstanceList &&instances) { add(std::move(instances.getInnerList())); } - INLINE void ServiceInstanceList::addRange(OneOrList &&instances) + INLINE void ServiceInstanceList::add(OneOrList &&instances) { - _oneOrList.addRange(std::move(instances)); + _oneOrList.add(std::move(instances)); } INLINE OneOrList &ServiceInstanceList::getInnerList() { return _oneOrList; } @@ -52,8 +49,6 @@ namespace sb::di::details _sealed = true; } - INLINE bool ServiceInstanceList::isSealed() const { return _sealed; } - INLINE void ServiceInstanceList::clear() { if (const auto single = _oneOrList.tryGetAsSingle()) diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp index 6fa49f0..a1488cf 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp @@ -13,6 +13,7 @@ namespace sb::di::details bool _sealed = false; public: + ServiceInstanceList() = default; explicit ServiceInstanceList(ServiceInstance instance); explicit ServiceInstanceList(std::size_t size); @@ -25,9 +26,8 @@ namespace sb::di::details ServiceInstanceList &operator=(ServiceInstanceList &&) = default; void add(ServiceInstance &&instance); - - void addRange(ServiceInstanceList &&instances); - void addRange(OneOrList &&instances); + void add(ServiceInstanceList &&instances); + void add(OneOrList &&instances); [[nodiscard]] auto begin() const { return _oneOrList.getAsList().begin(); } [[nodiscard]] auto end() const { return _oneOrList.getAsList().end(); } @@ -51,10 +51,11 @@ namespace sb::di::details void seal(); - [[nodiscard]] bool isSealed() const; + [[nodiscard]] bool isSealed() const { return _sealed; } void clear(); + operator bool() const { return !_oneOrList.isUninitialized(); } ~ServiceInstanceList() = default; }; } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp index eabe2e5..268072e 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp @@ -15,68 +15,45 @@ namespace sb::di::details { } - INLINE std::optional ServiceAliasInstancesResolver::createOne(const ServiceInstance *original) const + INLINE ServiceInstanceList ServiceAliasInstancesResolver::createOne(const ServiceInstance *original) const { - return original ? std::make_optional(ServiceInstanceList{create(_descriptors.last(), *original)}) : std::nullopt; + return original ? ServiceInstanceList{create(_descriptors.last(), *original)} : ServiceInstanceList{}; } - INLINE ServiceInstance ServiceAliasInstancesResolver::map( ServiceInstance &&original) const{ + INLINE ServiceInstance ServiceAliasInstancesResolver::map(ServiceInstance &&original) const + { original.addCastOffset(_descriptors.last().getCastOffset()); return std::move(original); } - INLINE ServiceInstance ServiceAliasInstancesResolver::create(const ServiceDescriptor& descriptor, const ServiceInstance &original) const + INLINE ServiceInstance ServiceAliasInstancesResolver::create(const ServiceDescriptor &descriptor, + const ServiceInstance &original) const { return _creator.createInstanceAlias(descriptor, original); } - INLINE void ServiceAliasInstancesResolver::createAll(const ServiceDescriptor &descriptor, const OneOrList &originals, - std::optional &instances) const - { - if (instances) - { - instances->reserve(instances->size() + originals.size()); - } - originals.forEach([&](const ServiceInstance &instance) { - if (!instances) - { - instances = ServiceInstanceList{create(descriptor, instance)}; - instances->reserve(originals.size()); - } - else - { - instances->add(create(descriptor, instance)); - } - }); - } - - INLINE void ServiceAliasInstancesResolver::createAll( - const ServiceDescriptor &descriptor, const OneOrList &originals, - ServiceInstanceList &instances) const + INLINE void ServiceAliasInstancesResolver::createAll(const ServiceDescriptor &descriptor, + const OneOrList &originals, + ServiceInstanceList &instances) const { instances.reserve(instances.size() + originals.size()); - originals.forEach([&](const ServiceInstance &instance) { - instances.add(create(descriptor, instance)); - }); + originals.forEach([&](const ServiceInstance &instance) { instances.add(create(descriptor, instance)); }); } - INLINE void ServiceAliasInstancesResolver::createRest( - const ServiceDescriptor &descriptor, const OneOrList &originals, - ServiceInstanceList &instances) const + INLINE void ServiceAliasInstancesResolver::createRest(const ServiceDescriptor &descriptor, + const OneOrList &originals, + ServiceInstance &&first, ServiceInstanceList &instances) const { if (const auto size = originals.size(); size > 1) { - instances.reserve(instances.size()+ size); - auto first = create(descriptor, originals.first()); + instances.reserve(instances.size() + size); originals.forEach([&](const ServiceInstance &instance, const std::size_t index) { - if (index && index < size - 1) // skip first and last + if (index < size - 1) // skip last { instances.add(create(descriptor, instance)); } }); - instances.add(std::move(first)); - std::swap(instances.first(), instances.last()); } - instances.seal(); + instances.add(std::move(first)); } } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index 15274ac..ab34523 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -89,10 +89,10 @@ namespace sb::di::details return descriptors ? tryCreateTransient(*descriptors) : ServiceInstance{}; } - INLINE std::optional> ServiceInstanceProvider::tryCreateInstances(const ServiceId &id) + INLINE OneOrList ServiceInstanceProvider::tryCreateInstances(const ServiceId &id) { const auto descriptors = findDescriptors(id, true); - return descriptors ? tryCreateAllTransient(*descriptors) : std::nullopt; + return descriptors ? tryCreateAllTransient(*descriptors) : OneOrList{}; } INLINE ServiceInstance ServiceInstanceProvider::createInstanceInPlace(const ServiceId &id) @@ -139,8 +139,9 @@ namespace sb::di::details return nullptr; } - INLINE ServiceInstanceList *ServiceInstanceProvider::tryRegisterAndGet( - const ServiceId &id, const ServiceDescriptorList &descriptors, std::optional &&instances) + INLINE ServiceInstanceList *ServiceInstanceProvider::tryRegisterAndGet(const ServiceId &id, + const ServiceDescriptorList &descriptors, + ServiceInstanceList &&instances) { if (instances) { @@ -152,75 +153,72 @@ namespace sb::di::details lifeTime = _scoped.contains(originalId) ? ServiceLifeTimes::Scoped : ServiceLifeTimes::Singleton; } auto &instancesMap = lifeTime.isSingleton() ? _root.getSingletons() : _scoped; - return &instancesMap.insert(id, std::move(*instances)); + return &instancesMap.insert(id, std::move(instances)); } return nullptr; } - INLINE std::optional ServiceInstanceProvider::tryCreateNonTransient( - const ServiceDescriptorList &descriptors) + INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateNonTransient(const ServiceDescriptorList &descriptors) { - if (!descriptors.isAlias()) + if (descriptors.isAlias()) { - RequireDescriptor::nonTransient(descriptors.first()); - return makeResolver(descriptors).createOneInPlace(); + auto &last = descriptors.last(); + return makeAliasResolver(descriptors) + .createOne(tryGetInstance({last.getImplementationTypeId(), last.getImplementationKey()})); } - auto &last = descriptors.last(); - return makeAliasResolver(descriptors) - .createOne(tryGetInstance({last.getImplementationTypeId(), last.getImplementationKey()})); + RequireDescriptor::nonTransient(descriptors.first()); + return makeResolver(descriptors).createOneInPlace(); } - INLINE std::optional ServiceInstanceProvider::tryCreateAllNonTransient( - const ServiceDescriptorList &descriptors) + INLINE ServiceInstanceList + ServiceInstanceProvider::tryCreateAllNonTransient(const ServiceDescriptorList &descriptors) { - if (!descriptors.isAlias()) + if (descriptors.isAlias()) { - RequireDescriptor::nonTransient(descriptors.first()); - return makeResolver(descriptors).createAllInPlace(); + return makeAliasResolver(descriptors).createAll([&](const ServiceDescriptor &alias) { + return tryGetInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); + }); } - return makeAliasResolver(descriptors).createAll([&](const ServiceDescriptor &aliasDescriptor) { - return tryGetInstances({aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}); - }); + RequireDescriptor::nonTransient(descriptors.first()); + return makeResolver(descriptors).createAllInPlace(); } INLINE ServiceInstanceList *ServiceInstanceProvider::createRestNonTransient( const ServiceDescriptorList &descriptors, ServiceInstanceList &instances) { - if (!descriptors.isAlias()) + if (descriptors.isAlias()) { - RequireDescriptor::nonTransient(descriptors.first()); - return &makeResolver(descriptors).createRestInPlace(instances); + return &makeAliasResolver(descriptors).createRest(instances, [&](const ServiceDescriptor &alias) { + return tryGetInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); + }); } - makeAliasResolver(descriptors).createRest(instances, [&](const ServiceDescriptor &aliasDescriptor) { - return tryGetInstances({aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}); - }); - return &instances; + RequireDescriptor::nonTransient(descriptors.first()); + return &makeResolver(descriptors).createRestInPlace(instances); } INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransient(const ServiceDescriptorList &descriptors) { - if (!descriptors.isAlias()) + if (descriptors.isAlias()) { - RequireDescriptor::transient(descriptors.first()); - return makeResolver(descriptors).create(); + auto &last = descriptors.last(); + return makeAliasResolver(descriptors) + .map(tryCreateInstance({last.getImplementationTypeId(), last.getImplementationKey()})); } - auto &last = descriptors.last(); - return makeAliasResolver(descriptors) - .map(tryCreateInstance({last.getImplementationTypeId(), last.getImplementationKey()})); + RequireDescriptor::transient(descriptors.first()); + return makeResolver(descriptors).create(); } - INLINE std::optional> ServiceInstanceProvider::tryCreateAllTransient( + INLINE OneOrList ServiceInstanceProvider::tryCreateAllTransient( const ServiceDescriptorList &descriptors) { - if (!descriptors.isAlias()) + if (descriptors.isAlias()) { - RequireDescriptor::transient(descriptors.first()); - return std::move(makeResolver(descriptors).createAll().getInnerList()); + return makeAliasResolver(descriptors).mapAll([&](const ServiceDescriptor &alias) { + return tryCreateInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); + }); } - return makeAliasResolver(descriptors).mapAll([&](const ServiceDescriptor &aliasDescriptor) { - return tryCreateInstances( - {aliasDescriptor.getImplementationTypeId(), aliasDescriptor.getImplementationKey()}); - }); + RequireDescriptor::transient(descriptors.first()); + return std::move(makeResolver(descriptors).createAll().getInnerList()); } INLINE ServiceInstancesResolver ServiceInstanceProvider::makeResolver(const ServiceDescriptorList &descriptors) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp index 72cefa9..2810ba7 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp @@ -54,17 +54,11 @@ namespace sb::di::details INLINE ServiceInstanceList ServiceInstancesResolver::createAll(const bool inPlaceRequest) const { - ServiceInstanceList instances{_creator.createInstance(_descriptors.first(), inPlaceRequest)}; - if (const auto size = _descriptors.size(); size > 1) - { - instances.reserve(size); - _descriptors.getInnerList().forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) { - if (index) // skip first - { - instances.add(_creator.createInstance(descriptor, inPlaceRequest)); - } - }); - } + ServiceInstanceList instances{}; + instances.reserve(_descriptors.size()); + _descriptors.getInnerList().forEach([&](const ServiceDescriptor &descriptor) { + instances.add(_creator.createInstance(descriptor, inPlaceRequest)); + }); instances.seal(); return instances; } diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp index 6a5b1db..97578b7 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp @@ -16,27 +16,26 @@ namespace sb::di::details public: ServiceAliasInstancesResolver(ServiceInstanceCreator &creator, const ServiceDescriptorList &descriptors); - [[nodiscard]] std::optional createOne(const ServiceInstance *original) const; + [[nodiscard]] ServiceInstanceList createOne(const ServiceInstance *original) const; - template std::optional createAll(TFactory originalFactory) const + template ServiceInstanceList createAll(TFactory originalFactory) const { - std::optional result; + ServiceInstanceList instances; _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { if (const OneOrList *originals = originalFactory(aliasDescriptor)) { - createAll(aliasDescriptor, *originals, result); + createAll(aliasDescriptor, *originals, instances); } }); - if (result) - { - result->seal(); - } - return result; + instances.seal(); + return instances; } template ServiceInstanceList &createRest(ServiceInstanceList &instances, TFactory originalFactory) const { + auto first = std::move(instances.first()); + instances = ServiceInstanceList{}; const auto size = _descriptors.size(); _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { if (const OneOrList *originals = originalFactory(aliasDescriptor)) @@ -47,7 +46,7 @@ namespace sb::di::details } else { - createRest(aliasDescriptor, *originals, instances); + createRest(aliasDescriptor, *originals, std::move(first), instances); } } }); @@ -57,43 +56,33 @@ namespace sb::di::details [[nodiscard]] ServiceInstance map(ServiceInstance &&original) const; - template std::optional> mapAll(TFactory originalFactory) const + template OneOrList mapAll(TFactory originalFactory) const { - std::optional> result; + OneOrList instances; _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { - if (std::optional> originals = originalFactory(aliasDescriptor)) + if (OneOrList originals = originalFactory(aliasDescriptor)) { if (aliasDescriptor.getCastOffset()) { - originals->forEach([&](ServiceInstance &instance) { + originals.forEach([&](ServiceInstance &instance) { instance.addCastOffset(aliasDescriptor.getCastOffset()); }); } - if (!result) - { - result = std::move(originals); - } - else - { - result->addRange(std::move(*originals)); - } + instances.add(std::move(originals)); } }); - return result; + return instances; } private: [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, const ServiceInstance &original) const; - void createAll(const ServiceDescriptor &descriptor, const OneOrList &originals, - std::optional &instances) const; - void createAll(const ServiceDescriptor &descriptor, const OneOrList &originals, ServiceInstanceList &instances) const; void createRest(const ServiceDescriptor &descriptor, const OneOrList &originals, - ServiceInstanceList &instances) const; + ServiceInstance &&first, ServiceInstanceList &instances) const; }; } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index c1458ac..b0396ef 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -60,7 +60,7 @@ namespace sb::di::details { return tryCreateInstance(ServiceId{serviceTypeId}); } - std::optional> tryCreateInstances(const TypeId serviceTypeId) override + OneOrList tryCreateInstances(const TypeId serviceTypeId) override { return tryCreateInstances(ServiceId{serviceTypeId}); } @@ -97,8 +97,8 @@ namespace sb::di::details { return tryCreateInstance(ServiceId{serviceTypeId, serviceKey}); } - std::optional> tryCreateKeyedInstances(const TypeId serviceTypeId, - const std::string_view serviceKey) override + OneOrList tryCreateKeyedInstances(const TypeId serviceTypeId, + const std::string_view serviceKey) override { return tryCreateInstances(ServiceId{serviceTypeId, serviceKey}); } @@ -121,7 +121,7 @@ namespace sb::di::details ServiceInstance createInstance(const ServiceId &id); ServiceInstance tryCreateInstance(const ServiceId &id); - std::optional> tryCreateInstances(const ServiceId &id); + OneOrList tryCreateInstances(const ServiceId &id); ServiceInstance createInstanceInPlace(const ServiceId &id); ServiceInstance tryCreateInstanceInPlace(const ServiceId &id); @@ -133,15 +133,15 @@ namespace sb::di::details [[nodiscard]] const ServiceDescriptorList *findDescriptors(const ServiceId &id, bool transient) const; ServiceInstanceList *tryRegisterAndGet(const ServiceId &id, const ServiceDescriptorList &descriptors, - std::optional &&instances); + ServiceInstanceList &&instances); - std::optional tryCreateNonTransient(const ServiceDescriptorList &descriptors); - std::optional tryCreateAllNonTransient(const ServiceDescriptorList &descriptors); + ServiceInstanceList tryCreateNonTransient(const ServiceDescriptorList &descriptors); + ServiceInstanceList tryCreateAllNonTransient(const ServiceDescriptorList &descriptors); ServiceInstanceList *createRestNonTransient(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); ServiceInstance tryCreateTransient(const ServiceDescriptorList &descriptors); - std::optional> tryCreateAllTransient(const ServiceDescriptorList &descriptors); + OneOrList tryCreateAllTransient(const ServiceDescriptorList &descriptors); ServiceInstancesResolver makeResolver(const ServiceDescriptorList &descriptors); ServiceAliasInstancesResolver makeAliasResolver(const ServiceDescriptorList &descriptors); diff --git a/Include/SevenBit/DI/IServiceInstanceProvider.hpp b/Include/SevenBit/DI/IServiceInstanceProvider.hpp index 9d446f7..d9d5015 100644 --- a/Include/SevenBit/DI/IServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/IServiceInstanceProvider.hpp @@ -98,14 +98,14 @@ namespace sb::di * @brief Creates service instances * @details If service was not registered or was registered as scoped/singleton, method returns null option */ - virtual std::optional> tryCreateInstances(TypeId serviceTypeId) = 0; + virtual OneOrList tryCreateInstances(TypeId serviceTypeId) = 0; /** * @brief Creates service instances * @details If service was not registered or was registered as scoped/singleton, method returns null option */ - virtual std::optional> tryCreateKeyedInstances(TypeId serviceTypeId, - std::string_view serviceKey) = 0; + virtual OneOrList tryCreateKeyedInstances(TypeId serviceTypeId, + std::string_view serviceKey) = 0; /** * @brief Creates service instance in place, might throw exception diff --git a/Include/SevenBit/DI/OneOrList.hpp b/Include/SevenBit/DI/OneOrList.hpp index 79950e9..f41bf8a 100644 --- a/Include/SevenBit/DI/OneOrList.hpp +++ b/Include/SevenBit/DI/OneOrList.hpp @@ -10,11 +10,17 @@ namespace sb::di { + template class OneOrList { - std::variant> _variant{}; + struct Uninitialized + { + }; + + std::variant> _variant{}; public: + OneOrList() = default; explicit OneOrList(const std::size_t size) : _variant(std::vector{}) { reserve(size); } explicit OneOrList(T &&mainElement) : _variant(std::move(mainElement)) {} @@ -24,6 +30,8 @@ namespace sb::di OneOrList &operator=(const OneOrList &) = delete; OneOrList &operator=(OneOrList &&other) noexcept = default; + [[nodiscard]] bool isUninitialized() const { return std::holds_alternative(_variant); } + [[nodiscard]] bool isSingle() const { return std::holds_alternative(_variant); } [[nodiscard]] bool isList() const { return std::holds_alternative>(_variant); } std::vector &getAsList() { return std::get>(_variant); } @@ -41,27 +49,36 @@ namespace sb::di T *tryGetAsSingle() { return std::get_if(&_variant); } const T *tryGetAsSingle() const { return std::get_if(&_variant); } + explicit operator bool() const { return !isUninitialized(); } + void add(T &&element) { - tryConvertToList(); - getAsList().emplace_back(std::move(element)); + if (isUninitialized()) + { + _variant = std::move(element); + } + else + { + tryConvertToList(); + getAsList().emplace_back(std::move(element)); + } } - void addRange(OneOrList &&other) + void add(OneOrList &&other) { - tryConvertToList(); - auto &thisList = getAsList(); if (auto list = other.tryGetAsList()) { + tryConvertToList(); + auto &thisList = getAsList(); thisList.reserve(thisList.size() + list->size()); for (auto &element : *list) { thisList.emplace_back(std::move(element)); } } - else + else if (auto single = other.tryGetAsSingle()) { - thisList.emplace_back(std::move(other.getAsSingle())); + add(std::move(*single)); } } @@ -90,9 +107,20 @@ namespace sb::di T &operator[](std::size_t index) { auto single = tryGetAsSingle(); - return single ? *single : getAsList().at(index); + return single ? *single : getAsList()[index]; } const T &operator[](std::size_t index) const + { + auto single = tryGetAsSingle(); + return single ? *single : getAsList()[index]; + } + + T &at(std::size_t index) + { + auto single = tryGetAsSingle(); + return single ? *single : getAsList().at(index); + } + const T &at(std::size_t index) const { auto single = tryGetAsSingle(); return single ? *single : getAsList().at(index); @@ -100,16 +128,23 @@ namespace sb::di [[nodiscard]] std::size_t size() const { + if (isSingle()) + { + return 1; + } auto list = tryGetAsList(); - return list ? list->size() : 1; + return list ? list->size() : 0; } [[nodiscard]] bool empty() const { return !size(); } void reserve(std::size_t newCapacity) { - tryConvertToList(); - getAsList().reserve(newCapacity); + if (newCapacity > 1) + { + tryConvertToList(); + getAsList().reserve(newCapacity); + } } void shrink() @@ -122,29 +157,33 @@ namespace sb::di template void forEach(TFunc fcn) { - if (auto instance = tryGetAsSingle()) + if (auto single = tryGetAsSingle()) { - callFcn(fcn, *instance, 0); - return; + callFcn(fcn, *single, 0); } - std::size_t index = 0; - for (auto &instance : getAsList()) + else if (auto list = tryGetAsList()) { - callFcn(fcn, instance, index++); + std::size_t index = 0; + for (auto &instance : *list) + { + callFcn(fcn, instance, index++); + } } } template void forEach(TFunc fcn) const { - if (const auto instance = tryGetAsSingle()) + if (const auto single = tryGetAsSingle()) { - callFcn(fcn, *instance, 0); - return; + callFcn(fcn, *single, 0); } - std::size_t index = 0; - for (const auto &instance : getAsList()) + else if (auto list = tryGetAsList()) { - callFcn(fcn, instance, index++); + std::size_t index = 0; + for (const auto &instance : *list) + { + callFcn(fcn, instance, index++); + } } } @@ -167,11 +206,18 @@ namespace sb::di private: void tryConvertToList() { - if (auto single = tryGetAsSingle()) + if (!isList()) { - std::vector vec; - vec.emplace_back(std::move(*single)); - _variant = std::move(vec); + if (auto single = tryGetAsSingle()) + { + std::vector vec; + vec.emplace_back(std::move(*single)); + _variant = std::move(vec); + } + else + { + _variant = std::vector{}; + } } } diff --git a/Include/SevenBit/DI/ServiceProvider.hpp b/Include/SevenBit/DI/ServiceProvider.hpp index 867aa61..4d5fd35 100644 --- a/Include/SevenBit/DI/ServiceProvider.hpp +++ b/Include/SevenBit/DI/ServiceProvider.hpp @@ -367,13 +367,11 @@ namespace sb::di */ template std::vector> createServices() { - if (auto optInstances = getInstanceProvider().tryCreateInstances(typeid(TService))) - { - return optInstances->map([&](ServiceInstance &instance) { - details::RequireInstance::valid(instance); - return instance.moveOutAsUniquePtr(); - }); - } + auto instances = getInstanceProvider().tryCreateInstances(typeid(TService)); + return instances.map([&](ServiceInstance &instance) { + details::RequireInstance::valid(instance); + return instance.moveOutAsUniquePtr(); + }); return {}; } @@ -395,13 +393,11 @@ namespace sb::di template std::vector> createKeyedServices(const std::string_view serviceKey) { - if (auto optInstances = getInstanceProvider().tryCreateKeyedInstances(typeid(TService), serviceKey)) - { - return optInstances->map([&](ServiceInstance &instance) { - details::RequireInstance::valid(instance); - return instance.moveOutAsUniquePtr(); - }); - } + auto instances = getInstanceProvider().tryCreateKeyedInstances(typeid(TService), serviceKey); + return instances.map([&](ServiceInstance &instance) { + details::RequireInstance::valid(instance); + return instance.moveOutAsUniquePtr(); + }); return {}; } }; diff --git a/Source/Source.cpp b/Source/Source.cpp index 89a70f1..dc8dd6d 100644 --- a/Source/Source.cpp +++ b/Source/Source.cpp @@ -9,6 +9,7 @@ #include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp" #include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp" #include "SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp" +#include "SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp" #include "SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp" #include "SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp" #include "SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp" diff --git a/Tests/Helpers/Mocks/ServiceInstanceProviderMock.hpp b/Tests/Helpers/Mocks/ServiceInstanceProviderMock.hpp index 693e1e4..e9ac599 100644 --- a/Tests/Helpers/Mocks/ServiceInstanceProviderMock.hpp +++ b/Tests/Helpers/Mocks/ServiceInstanceProviderMock.hpp @@ -16,8 +16,8 @@ struct ServiceInstanceProviderMock : public sb::di::IServiceInstanceProvider MOCK_METHOD((sb::di::ServiceInstance), createInstance, (sb::di::TypeId serviceTypeId), (override)); MOCK_METHOD((sb::di::ServiceInstance), tryCreateInstanceInPlace, (sb::di::TypeId serviceTypeId), (override)); MOCK_METHOD((sb::di::ServiceInstance), createInstanceInPlace, (sb::di::TypeId serviceTypeId), (override)); - MOCK_METHOD((std::optional>), tryCreateInstances, - (sb::di::TypeId serviceTypeId), (override)); + MOCK_METHOD((sb::di::OneOrList), tryCreateInstances, (sb::di::TypeId serviceTypeId), + (override)); MOCK_METHOD((const sb::di::ServiceInstance *), tryGetKeyedInstance, (sb::di::TypeId serviceTypeId, std::string_view serviceKey), (override)); @@ -33,6 +33,6 @@ struct ServiceInstanceProviderMock : public sb::di::IServiceInstanceProvider (sb::di::TypeId serviceTypeId, std::string_view serviceKey), (override)); MOCK_METHOD((sb::di::ServiceInstance), createKeyedInstanceInPlace, (sb::di::TypeId serviceTypeId, std::string_view serviceKey), (override)); - MOCK_METHOD((std::optional>), tryCreateKeyedInstances, + MOCK_METHOD((sb::di::OneOrList), tryCreateKeyedInstances, (sb::di::TypeId serviceTypeId, std::string_view serviceKey), (override)); }; diff --git a/Tests/Unit/Core/ServiceInstanceProviderRootTest.cpp b/Tests/Unit/Core/ServiceInstanceProviderRootTest.cpp index b737061..4384731 100644 --- a/Tests/Unit/Core/ServiceInstanceProviderRootTest.cpp +++ b/Tests/Unit/Core/ServiceInstanceProviderRootTest.cpp @@ -917,7 +917,7 @@ TEST_F(ServiceInstanceProviderRootTest, ShouldCreateInstances) EXPECT_FALSE(provider.tryCreateInstances(typeid(TestClass1))); EXPECT_FALSE(provider.tryCreateInstances(typeid(TestClass2))); - EXPECT_EQ(provider.tryCreateInstances(typeid(TestClass3))->size(), 1); + EXPECT_EQ(provider.tryCreateInstances(typeid(TestClass3)).size(), 1); EXPECT_FALSE(provider.tryCreateInstances(typeid(TestClass4))); EXPECT_FALSE(provider.tryCreateInstances(typeid(TestInheritClass5))); EXPECT_FALSE(provider.tryCreateInstances(typeid(TestInheritClass6))); @@ -941,7 +941,7 @@ TEST_F(ServiceInstanceProviderRootTest, ShouldCreateKeyedInstances) EXPECT_FALSE(provider.tryCreateKeyedInstances(typeid(TestClass1), "key")); EXPECT_FALSE(provider.tryCreateKeyedInstances(typeid(TestClass2), "key")); - EXPECT_EQ(provider.tryCreateKeyedInstances(typeid(TestClass3), "key")->size(), 1); + EXPECT_EQ(provider.tryCreateKeyedInstances(typeid(TestClass3), "key").size(), 1); EXPECT_FALSE(provider.tryCreateKeyedInstances(typeid(TestClass4), "key")); EXPECT_FALSE(provider.tryCreateKeyedInstances(typeid(TestInheritClass5), "key")); EXPECT_FALSE(provider.tryCreateKeyedInstances(typeid(TestInheritClass6), "key")); @@ -962,7 +962,7 @@ TEST_F(ServiceInstanceProviderRootTest, ShouldCreateInstancesInOrder) sb::di::details::ServiceInstanceProviderRoot provider(describers.begin(), describers.end()); provider.init(mock); - auto services = *provider.tryCreateInstances(typeid(TestInheritClass1)); + auto services = provider.tryCreateInstances(typeid(TestInheritClass1)); EXPECT_EQ(services.size(), 5); EXPECT_EQ(static_cast(services[0].getAs())->number(), 1); EXPECT_EQ(static_cast(services[1].getAs())->number(), 2); @@ -994,7 +994,7 @@ TEST_F(ServiceInstanceProviderRootTest, ShouldCreateKeyedInstancesInOrder) sb::di::details::ServiceInstanceProviderRoot provider(describers.begin(), describers.end()); provider.init(mock); - auto services = *provider.tryCreateKeyedInstances(typeid(TestInheritClass1), "key"); + auto services = provider.tryCreateKeyedInstances(typeid(TestInheritClass1), "key"); EXPECT_EQ(services.size(), 5); EXPECT_EQ(static_cast(services[0].getAs())->number(), 1); EXPECT_EQ(static_cast(services[1].getAs())->number(), 2); @@ -1021,7 +1021,7 @@ TEST_F(ServiceInstanceProviderRootTest, ShouldCreateAliasInstancesInOrder) sb::di::details::ServiceInstanceProviderRoot provider(describers.begin(), describers.end()); provider.init(mock); - auto services = *provider.tryCreateInstances(typeid(TestInheritClass1)); + auto services = provider.tryCreateInstances(typeid(TestInheritClass1)); EXPECT_EQ(services.size(), 5); EXPECT_EQ(static_cast(services[0].getAs())->number(), 2); EXPECT_EQ(static_cast(services[1].getAs())->number(), 3); @@ -1051,7 +1051,7 @@ TEST_F(ServiceInstanceProviderRootTest, ShouldCreateKeyedAliasInstancesInOrder) sb::di::details::ServiceInstanceProviderRoot provider(describers.begin(), describers.end()); provider.init(mock); - auto services = *provider.tryCreateKeyedInstances(typeid(TestInheritClass1), "key"); + auto services = provider.tryCreateKeyedInstances(typeid(TestInheritClass1), "key"); EXPECT_EQ(services.size(), 5); EXPECT_EQ(static_cast(services[0].getAs())->number(), 2); EXPECT_EQ(static_cast(services[1].getAs())->number(), 3); diff --git a/Tests/Unit/Factories/ServiceFactoryTest.cpp b/Tests/Unit/Factories/ServiceFactoryTest.cpp index 9397b50..0cf370c 100644 --- a/Tests/Unit/Factories/ServiceFactoryTest.cpp +++ b/Tests/Unit/Factories/ServiceFactoryTest.cpp @@ -191,8 +191,7 @@ TEST_F(ServiceFactoryTest, ShouldCreateDependencyUniq1Service) EXPECT_TRUE(instance); EXPECT_TRUE(instance->isValid()); EXPECT_TRUE(instance->get()); - EXPECT_TRUE( - dynamic_cast *>(instance.get())); + EXPECT_TRUE(dynamic_cast *>(instance.get())); } TEST_F(ServiceFactoryTest, ShouldCreateDependencyUniq2Service) @@ -212,8 +211,7 @@ TEST_F(ServiceFactoryTest, ShouldCreateDependencyUniq2Service) EXPECT_TRUE(instance); EXPECT_TRUE(instance->isValid()); EXPECT_TRUE(instance->get()); - EXPECT_TRUE( - dynamic_cast *>(instance.get())); + EXPECT_TRUE(dynamic_cast *>(instance.get())); } TEST_F(ServiceFactoryTest, ShouldCreateDependencyVec1Service) @@ -265,7 +263,7 @@ TEST_F(ServiceFactoryTest, ShouldCreateDependencyVec3Service) sb::di::OneOrList result{std::move(test1)}; EXPECT_CALL(mock.getMock(), tryCreateInstances(sb::di::TypeId{typeid(TestDependencyClass)})) - .WillOnce(testing::Return(std::make_optional(std::move(result)))); + .WillOnce(testing::Return(std::move(result))); const sb::di::details::ServiceFactory factory; @@ -287,7 +285,7 @@ TEST_F(ServiceFactoryTest, ShouldCreateDependencyVec4Service) sb::di::OneOrList result{std::move(test1)}; EXPECT_CALL(mock.getMock(), tryCreateInstances(sb::di::TypeId{typeid(TestDependencyClass)})) - .WillOnce(testing::Return(std::make_optional(std::move(result)))); + .WillOnce(testing::Return(std::move(result))); const sb::di::details::ServiceFactory factory; diff --git a/Tests/Unit/Factories/ServiceFcnFactoryTest.cpp b/Tests/Unit/Factories/ServiceFcnFactoryTest.cpp index ab5c663..407c86e 100644 --- a/Tests/Unit/Factories/ServiceFcnFactoryTest.cpp +++ b/Tests/Unit/Factories/ServiceFcnFactoryTest.cpp @@ -212,8 +212,7 @@ TEST_F(ServiceFcnFactoryTest, ShouldCreateDependencyUniq1Service) EXPECT_TRUE(instance); EXPECT_TRUE(instance->isValid()); EXPECT_TRUE(instance->get()); - EXPECT_TRUE( - dynamic_cast *>(instance.get())); + EXPECT_TRUE(dynamic_cast *>(instance.get())); } TEST_F(ServiceFcnFactoryTest, ShouldCreateDependencyUniq2Service) @@ -235,8 +234,7 @@ TEST_F(ServiceFcnFactoryTest, ShouldCreateDependencyUniq2Service) EXPECT_TRUE(instance); EXPECT_TRUE(instance->isValid()); EXPECT_TRUE(instance->get()); - EXPECT_TRUE( - dynamic_cast *>(instance.get())); + EXPECT_TRUE(dynamic_cast *>(instance.get())); } TEST_F(ServiceFcnFactoryTest, ShouldCreateDependencyVec1Service) @@ -290,7 +288,7 @@ TEST_F(ServiceFcnFactoryTest, ShouldCreateDependencyVec3Service) sb::di::OneOrList result{std::move(test1)}; EXPECT_CALL(mock.getMock(), tryCreateInstances(sb::di::TypeId{typeid(TestDependencyClass)})) - .WillOnce(testing::Return(std::make_optional(std::move(result)))); + .WillOnce(testing::Return(std::move(result))); const sb::di::details::ServiceFcnFactory factory{ [&](std::vector> ob) { return TestDependencyVecClass3(std::move(ob)); }}; @@ -313,12 +311,11 @@ TEST_F(ServiceFcnFactoryTest, ShouldCreateDependencyVec4Service) sb::di::OneOrList result{std::move(test1)}; EXPECT_CALL(mock.getMock(), tryCreateInstances(sb::di::TypeId{typeid(TestDependencyClass)})) - .WillOnce(testing::Return(std::make_optional(std::move(result)))); + .WillOnce(testing::Return(std::move(result))); - const sb::di::details::ServiceFcnFactory factory{ - [&](const std::vector> ob) { - return std::make_unique(std::vector>{}); - }}; + const sb::di::details::ServiceFcnFactory factory{[&](const std::vector> ob) { + return std::make_unique(std::vector>{}); + }}; const auto instance = factory.createInstance(mock, true); diff --git a/Tests/Unit/Helpers/ServiceGetterTest.cpp b/Tests/Unit/Helpers/ServiceGetterTest.cpp index a631d0b..6a1a608 100644 --- a/Tests/Unit/Helpers/ServiceGetterTest.cpp +++ b/Tests/Unit/Helpers/ServiceGetterTest.cpp @@ -125,7 +125,7 @@ TEST_F(ServiceGetterTest, ShouldGetDependencyVec3Service) sb::di::OneOrList result{std::move(test1)}; EXPECT_CALL(mock.getMock(), tryCreateInstances(sb::di::TypeId{typeid(TestDependencyClass)})) - .WillOnce(testing::Return(std::make_optional(std::move(result)))); + .WillOnce(testing::Return(std::move(result))); auto act = [&] { std::vector> instance = From d69661717b35c48bf46d967cc4d1798af540ed14 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Mon, 22 Apr 2024 17:14:09 +0200 Subject: [PATCH 07/19] refactor alias code --- .../Containers/Impl/ServiceInstanceList.hpp | 22 +- .../Containers/ServiceInstanceList.hpp | 6 +- .../Core/IServiceInstanceProviderRoot.hpp | 4 +- .../Impl/ServiceAliasInstancesResolver.hpp | 59 -- .../Core/Impl/ServiceAliasesCreator.hpp | 82 ++ .../Core/Impl/ServiceInstanceCreator.hpp | 48 -- .../Core/Impl/ServiceInstanceProvider.hpp | 129 ++- .../Core/Impl/ServiceInstanceProviderRoot.hpp | 5 +- .../Core/Impl/ServiceInstancesCreator.hpp | 90 ++ .../Core/Impl/ServiceInstancesResolver.hpp | 85 -- .../Core/ServiceAliasInstancesResolver.hpp | 91 --- .../DI/Details/Core/ServiceAliasesCreator.hpp | 69 ++ .../Details/Core/ServiceInstanceCreator.hpp | 31 - .../Details/Core/ServiceInstanceProvider.hpp | 28 +- .../Core/ServiceInstanceProviderRoot.hpp | 2 +- .../Details/Core/ServiceInstancesCreator.hpp | 38 + .../Details/Core/ServiceInstancesResolver.hpp | 39 - Include/SevenBit/DI/OneOrList.hpp | 12 + .../Unit/Core/ServiceInstanceCreatorTest.cpp | 280 +++---- .../Unit/Core/ServiceInstanceResolverTest.cpp | 767 +++++++++--------- 20 files changed, 909 insertions(+), 978 deletions(-) delete mode 100644 Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp create mode 100644 Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp delete mode 100644 Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceCreator.hpp create mode 100644 Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp delete mode 100644 Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp delete mode 100644 Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp create mode 100644 Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp delete mode 100644 Include/SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp create mode 100644 Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp delete mode 100644 Include/SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp index 71396fe..eae4007 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp @@ -9,15 +9,9 @@ namespace sb::di::details { INLINE ServiceInstanceList::ServiceInstanceList(const std::size_t size) : _oneOrList(size) {} - INLINE ServiceInstanceList::ServiceInstanceList(ServiceInstance instance) - : _oneOrList(RequireInstance::validAndGet(std::move(instance))) - { - } + INLINE ServiceInstanceList::ServiceInstanceList(ServiceInstance instance) : _oneOrList(std::move(instance)) {} - INLINE void ServiceInstanceList::add(ServiceInstance &&instance) - { - _oneOrList.add(RequireInstance::validAndGet(std::move(instance))); - } + INLINE void ServiceInstanceList::add(ServiceInstance &&instance) { _oneOrList.add(std::move(instance)); } INLINE void ServiceInstanceList::add(ServiceInstanceList &&instances) { add(std::move(instances.getInnerList())); } @@ -49,16 +43,6 @@ namespace sb::di::details _sealed = true; } - INLINE void ServiceInstanceList::clear() - { - if (const auto single = _oneOrList.tryGetAsSingle()) - { - single->clear(); - } - else - { - _oneOrList.getAsList().clear(); - } - } + INLINE void ServiceInstanceList::clear() { _oneOrList.clear(); } } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp index a1488cf..f018e3f 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp @@ -16,7 +16,6 @@ namespace sb::di::details ServiceInstanceList() = default; explicit ServiceInstanceList(ServiceInstance instance); explicit ServiceInstanceList(std::size_t size); - explicit ServiceInstanceList(OneOrList &&other) : _oneOrList(std::move(other)) {} ServiceInstanceList(const ServiceInstanceList &) = delete; @@ -25,6 +24,10 @@ namespace sb::di::details ServiceInstanceList &operator=(const ServiceInstanceList &) = delete; ServiceInstanceList &operator=(ServiceInstanceList &&) = default; + explicit operator bool() const { return !_oneOrList.isUninitialized(); } + + operator OneOrList() && { return std::move(_oneOrList); } + void add(ServiceInstance &&instance); void add(ServiceInstanceList &&instances); void add(OneOrList &&instances); @@ -55,7 +58,6 @@ namespace sb::di::details void clear(); - operator bool() const { return !_oneOrList.isUninitialized(); } ~ServiceInstanceList() = default; }; } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp index 15e9014..2005116 100644 --- a/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp @@ -4,7 +4,7 @@ #include "SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp" #include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" +#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" namespace sb::di::details { @@ -14,7 +14,7 @@ namespace sb::di::details virtual ServiceInstancesMap &getSingletons() = 0; - virtual ServiceInstanceCreator &getRootInstanceCreator() = 0; + virtual ServiceInstancesCreator &getRootCreator() = 0; virtual ~IServiceInstanceProviderRoot() = default; }; diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp deleted file mode 100644 index 268072e..0000000 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include -#include - -#include "SevenBit/DI/LibraryConfig.hpp" - -#include "SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp" - -namespace sb::di::details -{ - INLINE ServiceAliasInstancesResolver::ServiceAliasInstancesResolver(ServiceInstanceCreator &creator, - const ServiceDescriptorList &descriptors) - : _creator(creator), _descriptors(descriptors) - { - } - - INLINE ServiceInstanceList ServiceAliasInstancesResolver::createOne(const ServiceInstance *original) const - { - return original ? ServiceInstanceList{create(_descriptors.last(), *original)} : ServiceInstanceList{}; - } - - INLINE ServiceInstance ServiceAliasInstancesResolver::map(ServiceInstance &&original) const - { - original.addCastOffset(_descriptors.last().getCastOffset()); - return std::move(original); - } - - INLINE ServiceInstance ServiceAliasInstancesResolver::create(const ServiceDescriptor &descriptor, - const ServiceInstance &original) const - { - return _creator.createInstanceAlias(descriptor, original); - } - - INLINE void ServiceAliasInstancesResolver::createAll(const ServiceDescriptor &descriptor, - const OneOrList &originals, - ServiceInstanceList &instances) const - { - instances.reserve(instances.size() + originals.size()); - originals.forEach([&](const ServiceInstance &instance) { instances.add(create(descriptor, instance)); }); - } - - INLINE void ServiceAliasInstancesResolver::createRest(const ServiceDescriptor &descriptor, - const OneOrList &originals, - ServiceInstance &&first, ServiceInstanceList &instances) const - { - if (const auto size = originals.size(); size > 1) - { - instances.reserve(instances.size() + size); - originals.forEach([&](const ServiceInstance &instance, const std::size_t index) { - if (index < size - 1) // skip last - { - instances.add(create(descriptor, instance)); - } - }); - } - instances.add(std::move(first)); - } -} // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp new file mode 100644 index 0000000..c4da053 --- /dev/null +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp @@ -0,0 +1,82 @@ +#pragma once + +#include +#include + +#include "SevenBit/DI/LibraryConfig.hpp" + +#include "SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp" +#include "SevenBit/DI/Details/Services/AliasService.hpp" +#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" +#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" + +namespace sb::di::details +{ + INLINE ServiceInstance ServiceAliasesCreator::tryCreate(const ServiceDescriptor &descriptor, + const ServiceInstance *original) const + { + return original ? create(descriptor, *original) : ServiceInstance{}; + } + + INLINE ServiceInstance ServiceAliasesCreator::tryMap(const ServiceDescriptor &descriptor, + ServiceInstance &&original) const + { + original.addCastOffset(descriptor.getCastOffset()); + return std::move(original); + } + + INLINE void ServiceAliasesCreator::tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, + const ServiceInstanceList *originals) const + { + if (originals) + { + instances.reserve(instances.size() + originals->size()); + originals->getInnerList().forEach( + [&](const ServiceInstance &instance) { instances.add(create(descriptor, instance)); }); + } + } + + INLINE void ServiceAliasesCreator::tryCreateRest(ServiceInstanceList &instances, + const ServiceDescriptor &descriptor, + const ServiceInstanceList *originals, + ServiceInstance &&first) const + { + if (originals) + { + const auto size = originals->size(); + instances.reserve(instances.size() + size); + originals->getInnerList().forEach([&](const ServiceInstance &instance, const std::size_t index) { + if (index < size - 1) // skip last + { + instances.add(create(descriptor, instance)); + } + }); + instances.add(std::move(first)); + } + } + + INLINE void ServiceAliasesCreator::tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, + OneOrList &&originals) const + { + if (originals) + { + if (descriptor.getCastOffset()) + { + originals.forEach( + [&](ServiceInstance &instance) { instance.addCastOffset(descriptor.getCastOffset()); }); + } + instances.add(std::move(originals)); + } + } + + INLINE ServiceInstance ServiceAliasesCreator::create(const ServiceDescriptor &descriptor, + const ServiceInstance &original) const + { + RequireDescriptor::alias(descriptor); + RequireInstance::valid(original); + auto implementationType = descriptor.getImplementationTypeId(); + + auto implementation = std::make_unique(original.getAs(), implementationType); + return ServiceInstance{std::move(implementation), descriptor.getCastOffset()}; + } +} // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceCreator.hpp deleted file mode 100644 index 0ea3548..0000000 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceCreator.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include - -#include "SevenBit/DI/LibraryConfig.hpp" - -#include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" -#include "SevenBit/DI/Details/Services/AliasService.hpp" -#include "SevenBit/DI/Details/Utils/Require.hpp" -#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" -#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" - -namespace sb::di::details -{ - INLINE void ServiceInstanceCreator::setServiceProvider(ServiceProvider &serviceProvider) - { - _serviceProvider = &serviceProvider; - } - - INLINE ServiceInstance ServiceInstanceCreator::createInstance(const ServiceDescriptor &descriptor, - const bool inPlaceRequest) - { - RequireDescriptor::nonAlias(descriptor); - auto &provider = *Require::notNullAndGet(_serviceProvider); - const auto &factory = *Require::notNullAndGet(descriptor.getImplementationFactory()); - auto _ = _circularDependencyGuard(descriptor.getImplementationTypeId()); - - auto implementation = factory.createInstance(provider, inPlaceRequest); - return createInstance(std::move(implementation), descriptor.getCastOffset()); - } - - INLINE ServiceInstance ServiceInstanceCreator::createInstanceAlias(const ServiceDescriptor &descriptor, - const ServiceInstance &instance) - { - RequireDescriptor::alias(descriptor); - RequireInstance::valid(instance); - auto implementationType = descriptor.getImplementationTypeId(); - - auto implementation = std::make_unique(instance.getAs(), implementationType); - return createInstance(std::move(implementation), descriptor.getCastOffset()); - } - - INLINE ServiceInstance ServiceInstanceCreator::createInstance(IServiceInstance::Ptr &&implementation, - const ptrdiff_t castOffset) - { - return RequireInstance::validAndGet(ServiceInstance{std::move(implementation), castOffset}); - } -} // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index ab34523..c08ef04 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -45,9 +45,10 @@ namespace sb::di::details auto instances = findRegisteredInstances(id); if (!instances) { - if (const auto descriptors = findDescriptors(id, false)) + if (const auto descriptors = findNonTransientDescriptors(id)) { - instances = tryRegisterAndGet(id, *descriptors, tryCreateNonTransient(*descriptors)); + instances = + tryRegisterAndGet(id, *descriptors, ServiceInstanceList{tryCreateNonTransient(*descriptors)}); } } return instances ? &instances->last() : nullptr; @@ -58,16 +59,17 @@ namespace sb::di::details auto instances = findRegisteredInstances(id); if (!instances) { - if (const auto descriptors = findDescriptors(id, false)) + if (const auto descriptors = findNonTransientDescriptors(id)) { instances = tryRegisterAndGet(id, *descriptors, tryCreateAllNonTransient(*descriptors)); } } else if (!instances->isSealed()) { - if (const auto descriptors = findDescriptors(id, false)) + if (const auto descriptors = findNonTransientDescriptors(id)) { - instances = createRestNonTransient(*descriptors, *instances); + createRestNonTransient(*descriptors, *instances); + instances->seal(); } } return instances ? &instances->getInnerList() : nullptr; @@ -85,13 +87,13 @@ namespace sb::di::details INLINE ServiceInstance ServiceInstanceProvider::tryCreateInstance(const ServiceId &id) { - const auto descriptors = findDescriptors(id, true); + const auto descriptors = findTransientDescriptors(id); return descriptors ? tryCreateTransient(*descriptors) : ServiceInstance{}; } INLINE OneOrList ServiceInstanceProvider::tryCreateInstances(const ServiceId &id) { - const auto descriptors = findDescriptors(id, true); + const auto descriptors = findTransientDescriptors(id); return descriptors ? tryCreateAllTransient(*descriptors) : OneOrList{}; } @@ -108,10 +110,13 @@ namespace sb::di::details INLINE ServiceInstance ServiceInstanceProvider::tryCreateInstanceInPlace(const ServiceId &id) { - if (const auto descriptors = findDescriptors(id, true); - descriptors && !descriptors->isAlias() && descriptors->last().getImplementationTypeId() == id.getTypeId()) + if (const auto descriptors = findTransientDescriptors(id)) { - return makeResolver(*descriptors).createInPlace(); + if (auto &descriptor = descriptors->last(); + !descriptor.isAlias() && descriptor.getImplementationTypeId() == id.getTypeId()) + { + return selectCreator(descriptor).createInPlace(descriptor); + } } return ServiceInstance{}; } @@ -125,25 +130,25 @@ namespace sb::di::details return instances ? instances : second.findInstances(id); } - INLINE const ServiceDescriptorList *ServiceInstanceProvider::findDescriptors(const ServiceId &id, - const bool transient) const + INLINE const ServiceDescriptorList *ServiceInstanceProvider::findTransientDescriptors(const ServiceId &id) const { - if (const auto descriptors = _root.getDescriptorsMap().findDescriptors(id)) - { - if (const auto isTransient = descriptors->getLifeTime().isTransient(); - descriptors->isAlias() || (transient ? isTransient : !isTransient)) - { - return descriptors; - } - } - return nullptr; + const auto descriptors = _root.getDescriptorsMap().findDescriptors(id); + const auto isCorrect = descriptors && (descriptors->getLifeTime().isTransient() || descriptors->isAlias()); + return isCorrect ? descriptors : nullptr; + } + + INLINE const ServiceDescriptorList *ServiceInstanceProvider::findNonTransientDescriptors(const ServiceId &id) const + { + const auto descriptors = _root.getDescriptorsMap().findDescriptors(id); + const auto isCorrect = descriptors && (!descriptors->getLifeTime().isTransient() || descriptors->isAlias()); + return isCorrect ? descriptors : nullptr; } INLINE ServiceInstanceList *ServiceInstanceProvider::tryRegisterAndGet(const ServiceId &id, const ServiceDescriptorList &descriptors, ServiceInstanceList &&instances) { - if (instances) + if (const auto size = instances.size()) { auto &descriptor = descriptors.last(); auto lifeTime = descriptor.getLifeTime(); @@ -153,84 +158,78 @@ namespace sb::di::details lifeTime = _scoped.contains(originalId) ? ServiceLifeTimes::Scoped : ServiceLifeTimes::Singleton; } auto &instancesMap = lifeTime.isSingleton() ? _root.getSingletons() : _scoped; - return &instancesMap.insert(id, std::move(instances)); + auto &result = instancesMap.insert(id, std::move(instances)); + if (size > 1 || descriptors.size() == 1) + { + result.seal(); + } + return &result; } return nullptr; } - INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateNonTransient(const ServiceDescriptorList &descriptors) + INLINE ServiceInstance ServiceInstanceProvider::tryCreateNonTransient(const ServiceDescriptorList &descriptors) { - if (descriptors.isAlias()) + const auto &descriptor = descriptors.last(); + if (descriptor.isAlias()) { - auto &last = descriptors.last(); - return makeAliasResolver(descriptors) - .createOne(tryGetInstance({last.getImplementationTypeId(), last.getImplementationKey()})); + return getAliasesCreator().tryCreate( + descriptor, tryGetInstance({descriptor.getImplementationTypeId(), descriptor.getImplementationKey()})); } - RequireDescriptor::nonTransient(descriptors.first()); - return makeResolver(descriptors).createOneInPlace(); + RequireDescriptor::nonTransient(descriptor); + return selectCreator(descriptor).createInPlace(descriptor); } INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateAllNonTransient(const ServiceDescriptorList &descriptors) { - if (descriptors.isAlias()) + const auto descriptor = descriptors.last(); + if (descriptor.isAlias()) { - return makeAliasResolver(descriptors).createAll([&](const ServiceDescriptor &alias) { + return getAliasesCreator().tryCreateAll(descriptors, [&](const ServiceDescriptor &alias) { return tryGetInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); }); } - RequireDescriptor::nonTransient(descriptors.first()); - return makeResolver(descriptors).createAllInPlace(); + RequireDescriptor::nonTransient(descriptor); + return selectCreator(descriptor).createAllInPlace(descriptors); } - INLINE ServiceInstanceList *ServiceInstanceProvider::createRestNonTransient( - const ServiceDescriptorList &descriptors, ServiceInstanceList &instances) + INLINE void ServiceInstanceProvider::createRestNonTransient(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances) { - if (descriptors.isAlias()) + const auto descriptor = descriptors.last(); + if (descriptor.isAlias()) { - return &makeAliasResolver(descriptors).createRest(instances, [&](const ServiceDescriptor &alias) { + return getAliasesCreator().tryCreateRest(descriptors, instances, [&](const ServiceDescriptor &alias) { return tryGetInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); }); } - RequireDescriptor::nonTransient(descriptors.first()); - return &makeResolver(descriptors).createRestInPlace(instances); + RequireDescriptor::nonTransient(descriptor); + selectCreator(descriptor).createRestInPlace(descriptors, instances); } INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransient(const ServiceDescriptorList &descriptors) { - if (descriptors.isAlias()) + const auto &descriptor = descriptors.last(); + if (descriptor.isAlias()) { - auto &last = descriptors.last(); - return makeAliasResolver(descriptors) - .map(tryCreateInstance({last.getImplementationTypeId(), last.getImplementationKey()})); + return getAliasesCreator().tryMap(descriptor, tryCreateInstance({descriptor.getImplementationTypeId(), + descriptor.getImplementationKey()})); } - RequireDescriptor::transient(descriptors.first()); - return makeResolver(descriptors).create(); + RequireDescriptor::transient(descriptor); + return selectCreator(descriptor).create(descriptor); } - INLINE OneOrList ServiceInstanceProvider::tryCreateAllTransient( - const ServiceDescriptorList &descriptors) + INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateAllTransient(const ServiceDescriptorList &descriptors) { - if (descriptors.isAlias()) + const auto descriptor = descriptors.last(); + if (descriptor.isAlias()) { - return makeAliasResolver(descriptors).mapAll([&](const ServiceDescriptor &alias) { + return getAliasesCreator().tryMapAll(descriptors, [&](const ServiceDescriptor &alias) { return tryCreateInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); }); } - RequireDescriptor::transient(descriptors.first()); - return std::move(makeResolver(descriptors).createAll().getInnerList()); - } - - INLINE ServiceInstancesResolver ServiceInstanceProvider::makeResolver(const ServiceDescriptorList &descriptors) - { - auto &creator = descriptors.getLifeTime().isSingleton() ? _root.getRootInstanceCreator() : getInstanceCreator(); - return ServiceInstancesResolver{creator, descriptors}; - } - - INLINE ServiceAliasInstancesResolver - ServiceInstanceProvider::makeAliasResolver(const ServiceDescriptorList &descriptors) - { - auto &creator = descriptors.getLifeTime().isSingleton() ? _root.getRootInstanceCreator() : getInstanceCreator(); - return ServiceAliasInstancesResolver{creator, descriptors}; + RequireDescriptor::transient(descriptor); + return selectCreator(descriptor).createAll(descriptors); } } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp index 8842a0e..6009ec1 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp @@ -29,10 +29,7 @@ namespace sb::di::details INLINE ServiceInstancesMap &ServiceInstanceProviderRoot::getSingletons() { return _singletons; } - INLINE ServiceInstanceCreator &ServiceInstanceProviderRoot::getRootInstanceCreator() - { - return getInstanceCreator(); - } + INLINE ServiceInstancesCreator &ServiceInstanceProviderRoot::getRootCreator() { return getCreator(); } INLINE void ServiceInstanceProviderRoot::prebuildSingletons() { diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp new file mode 100644 index 0000000..c807571 --- /dev/null +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp @@ -0,0 +1,90 @@ +#pragma once + +#include +#include + +#include "SevenBit/DI/LibraryConfig.hpp" + +#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" +#include "SevenBit/DI/Details/Utils/Require.hpp" +#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" +#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" + +namespace sb::di::details +{ + INLINE ServiceInstance ServiceInstancesCreator::create(const ServiceDescriptor &descriptor) + { + return create(descriptor, false); + } + + INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors) + { + return createAll(descriptors, false); + } + + INLINE ServiceInstanceList &ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances) + { + return createRest(descriptors, instances, false); + } + + INLINE ServiceInstance ServiceInstancesCreator::createInPlace(const ServiceDescriptor &descriptor) + { + return create(descriptor, true); + } + + INLINE ServiceInstanceList ServiceInstancesCreator::createAllInPlace(const ServiceDescriptorList &descriptors) + { + return createAll(descriptors, true); + } + + INLINE ServiceInstanceList &ServiceInstancesCreator::createRestInPlace(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances) + { + return createRest(descriptors, instances, true); + } + + INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors, + const bool inPlaceRequest) + { + ServiceInstanceList instances{}; + instances.reserve(descriptors.size()); + descriptors.getInnerList().forEach( + [&](const ServiceDescriptor &descriptor) { instances.add(create(descriptor, inPlaceRequest)); }); + instances.seal(); + return instances; + } + + INLINE ServiceInstanceList &ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances, + const bool inPlaceRequest) + { + if (const auto size = descriptors.size(); size > 1) + { + instances.reserve(size); + auto first = create(descriptors.first(), inPlaceRequest); + descriptors.getInnerList().forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) { + if (index && index < size - 1) // skip first and last + { + instances.add(create(descriptor, inPlaceRequest)); + } + }); + instances.add(std::move(first)); + std::swap(instances.first(), instances.last()); + } + instances.seal(); + return instances; + } + + INLINE ServiceInstance ServiceInstancesCreator::create(const ServiceDescriptor &descriptor, + const bool inPlaceRequest) + { + RequireDescriptor::nonAlias(descriptor); + auto &provider = *Require::notNullAndGet(_serviceProvider); + const auto &factory = *Require::notNullAndGet(descriptor.getImplementationFactory()); + auto _ = _circularDependencyGuard(descriptor.getImplementationTypeId()); + + auto implementation = factory.createInstance(provider, inPlaceRequest); + return RequireInstance::validAndGet(ServiceInstance{std::move(implementation), descriptor.getCastOffset()}); + } +} // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp deleted file mode 100644 index 2810ba7..0000000 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once - -#include -#include - -#include "SevenBit/DI/LibraryConfig.hpp" - -#include "SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp" - -namespace sb::di::details -{ - INLINE ServiceInstancesResolver::ServiceInstancesResolver(ServiceInstanceCreator &creator, - const ServiceDescriptorList &descriptors) - : _creator(creator), _descriptors(descriptors) - { - } - - INLINE ServiceInstance ServiceInstancesResolver::create() const { return create(false); } - - INLINE ServiceInstanceList ServiceInstancesResolver::createOne() const { return createOne(false); } - - INLINE ServiceInstanceList ServiceInstancesResolver::createAll() const { return createAll(false); } - - INLINE ServiceInstanceList &ServiceInstancesResolver::createRest(ServiceInstanceList &instances) const - { - return createRest(instances, false); - } - - INLINE ServiceInstance ServiceInstancesResolver::createInPlace() const { return create(true); } - - INLINE ServiceInstanceList ServiceInstancesResolver::createOneInPlace() const { return createOne(true); } - - INLINE ServiceInstanceList ServiceInstancesResolver::createAllInPlace() const { return createAll(true); } - - INLINE ServiceInstanceList &ServiceInstancesResolver::createRestInPlace(ServiceInstanceList &instances) const - { - return createRest(instances, true); - } - - INLINE ServiceInstance ServiceInstancesResolver::create(const bool inPlaceRequest) const - { - return _creator.createInstance(_descriptors.last(), inPlaceRequest); - } - - INLINE ServiceInstanceList ServiceInstancesResolver::createOne(const bool inPlaceRequest) const - { - ServiceInstanceList instances{_creator.createInstance(_descriptors.last(), inPlaceRequest)}; - if (_descriptors.size() == 1) - { - instances.seal(); - } - return instances; - } - - INLINE ServiceInstanceList ServiceInstancesResolver::createAll(const bool inPlaceRequest) const - { - ServiceInstanceList instances{}; - instances.reserve(_descriptors.size()); - _descriptors.getInnerList().forEach([&](const ServiceDescriptor &descriptor) { - instances.add(_creator.createInstance(descriptor, inPlaceRequest)); - }); - instances.seal(); - return instances; - } - - INLINE ServiceInstanceList &ServiceInstancesResolver::createRest(ServiceInstanceList &instances, - const bool inPlaceRequest) const - { - if (const auto size = _descriptors.size(); size > 1) - { - instances.reserve(size); - auto first = _creator.createInstance(_descriptors.first(), inPlaceRequest); - _descriptors.getInnerList().forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) { - if (index && index < size - 1) // skip first and last - { - instances.add(_creator.createInstance(descriptor, inPlaceRequest)); - } - }); - instances.add(std::move(first)); - std::swap(instances.first(), instances.last()); - } - instances.seal(); - return instances; - } -} // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp deleted file mode 100644 index 97578b7..0000000 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp +++ /dev/null @@ -1,91 +0,0 @@ -#pragma once - -#include "SevenBit/DI/LibraryConfig.hpp" - -#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" - -namespace sb::di::details -{ - class EXPORT ServiceAliasInstancesResolver - { - ServiceInstanceCreator &_creator; - const ServiceDescriptorList &_descriptors; - - public: - ServiceAliasInstancesResolver(ServiceInstanceCreator &creator, const ServiceDescriptorList &descriptors); - - [[nodiscard]] ServiceInstanceList createOne(const ServiceInstance *original) const; - - template ServiceInstanceList createAll(TFactory originalFactory) const - { - ServiceInstanceList instances; - _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { - if (const OneOrList *originals = originalFactory(aliasDescriptor)) - { - createAll(aliasDescriptor, *originals, instances); - } - }); - instances.seal(); - return instances; - } - - template - ServiceInstanceList &createRest(ServiceInstanceList &instances, TFactory originalFactory) const - { - auto first = std::move(instances.first()); - instances = ServiceInstanceList{}; - const auto size = _descriptors.size(); - _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { - if (const OneOrList *originals = originalFactory(aliasDescriptor)) - { - if (index < size - 1) // not last - { - createAll(aliasDescriptor, *originals, instances); - } - else - { - createRest(aliasDescriptor, *originals, std::move(first), instances); - } - } - }); - instances.seal(); - return instances; - } - - [[nodiscard]] ServiceInstance map(ServiceInstance &&original) const; - - template OneOrList mapAll(TFactory originalFactory) const - { - OneOrList instances; - _descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { - if (OneOrList originals = originalFactory(aliasDescriptor)) - { - if (aliasDescriptor.getCastOffset()) - { - originals.forEach([&](ServiceInstance &instance) { - instance.addCastOffset(aliasDescriptor.getCastOffset()); - }); - } - instances.add(std::move(originals)); - } - }); - return instances; - } - - private: - [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, - const ServiceInstance &original) const; - - void createAll(const ServiceDescriptor &descriptor, const OneOrList &originals, - ServiceInstanceList &instances) const; - - void createRest(const ServiceDescriptor &descriptor, const OneOrList &originals, - ServiceInstance &&first, ServiceInstanceList &instances) const; - }; -} // namespace sb::di::details - -#ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp" -#endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp new file mode 100644 index 0000000..31651bd --- /dev/null +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp @@ -0,0 +1,69 @@ +#pragma once + +#include "SevenBit/DI/LibraryConfig.hpp" + +#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" +#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" + +namespace sb::di::details +{ + class EXPORT ServiceAliasesCreator + { + public: + [[nodiscard]] ServiceInstance tryCreate(const ServiceDescriptor &descriptor, + const ServiceInstance *original) const; + + template + ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const + { + ServiceInstanceList instances; + descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { + tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)); + }); + return instances; + } + + template + void tryCreateRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, + TResolver originalResolver) const + { + auto first = std::move(instances.first()); + instances.clear(); + const auto size = descriptors.size(); + descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { + index < size - 1 + ? tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)) + : tryCreateRest(instances, aliasDescriptor, originalResolver(aliasDescriptor), std::move(first)); + }); + } + + [[nodiscard]] ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const; + + template + ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const + { + ServiceInstanceList instances; + descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { + tryMapAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)); + }); + return instances; + } + + private: + void tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, + const ServiceInstanceList *originals) const; + + void tryCreateRest(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, + const ServiceInstanceList *originals, ServiceInstance &&first) const; + + void tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, + OneOrList &&originals) const; + + [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, + const ServiceInstance &original) const; + }; +} // namespace sb::di::details + +#ifdef _7BIT_DI_ADD_IMPL +#include "SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp" +#endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp deleted file mode 100644 index 81c53f6..0000000 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "SevenBit/DI/LibraryConfig.hpp" - -#include "SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp" -#include "SevenBit/DI/ServiceDescriptor.hpp" -#include "SevenBit/DI/ServiceInstance.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" - -namespace sb::di::details -{ - class EXPORT ServiceInstanceCreator - { - ServiceProvider *_serviceProvider = nullptr; - CircularDependencyGuard _circularDependencyGuard; - - public: - void setServiceProvider(ServiceProvider &serviceProvider); - - ServiceInstance createInstance(const ServiceDescriptor &descriptor, bool inPlaceRequest); - - ServiceInstance createInstanceAlias(const ServiceDescriptor &descriptor, const ServiceInstance &instance); - - private: - static ServiceInstance createInstance(IServiceInstance::Ptr &&implementation, ptrdiff_t castOffset); - }; -} // namespace sb::di::details - -#ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Core/Impl/ServiceInstanceCreator.hpp" -#endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index b0396ef..428c204 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -8,9 +8,8 @@ #include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" #include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" #include "SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp" -#include "SevenBit/DI/Details/Core/ServiceAliasInstancesResolver.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp" +#include "SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp" +#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" #include "SevenBit/DI/IServiceInstanceProvider.hpp" #include "SevenBit/DI/ServiceProviderOptions.hpp" @@ -19,7 +18,8 @@ namespace sb::di::details class EXPORT ServiceInstanceProvider : public IServiceInstanceProvider { ServiceProviderOptions _options; - ServiceInstanceCreator _instanceCreator; + ServiceInstancesCreator _instanceCreator; + ServiceAliasesCreator _aliasesCreator; IServiceInstanceProviderRoot &_root; ServiceInstancesMap _scoped; @@ -130,23 +130,25 @@ namespace sb::di::details ServiceInstanceList *findRegisteredInstances(const ServiceId &id); - [[nodiscard]] const ServiceDescriptorList *findDescriptors(const ServiceId &id, bool transient) const; + [[nodiscard]] const ServiceDescriptorList *findTransientDescriptors(const ServiceId &id) const; + [[nodiscard]] const ServiceDescriptorList *findNonTransientDescriptors(const ServiceId &id) const; ServiceInstanceList *tryRegisterAndGet(const ServiceId &id, const ServiceDescriptorList &descriptors, ServiceInstanceList &&instances); - ServiceInstanceList tryCreateNonTransient(const ServiceDescriptorList &descriptors); + ServiceInstance tryCreateNonTransient(const ServiceDescriptorList &descriptors); ServiceInstanceList tryCreateAllNonTransient(const ServiceDescriptorList &descriptors); - ServiceInstanceList *createRestNonTransient(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances); + void createRestNonTransient(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); ServiceInstance tryCreateTransient(const ServiceDescriptorList &descriptors); - OneOrList tryCreateAllTransient(const ServiceDescriptorList &descriptors); + ServiceInstanceList tryCreateAllTransient(const ServiceDescriptorList &descriptors); - ServiceInstancesResolver makeResolver(const ServiceDescriptorList &descriptors); - ServiceAliasInstancesResolver makeAliasResolver(const ServiceDescriptorList &descriptors); - - ServiceInstanceCreator &getInstanceCreator() { return _instanceCreator; } + ServiceAliasesCreator &getAliasesCreator() { return _aliasesCreator; } + ServiceInstancesCreator &getCreator() { return _instanceCreator; } + ServiceInstancesCreator &selectCreator(const ServiceDescriptor &descriptor) + { + return descriptor.getLifeTime().isSingleton() ? _root.getRootCreator() : getCreator(); + } }; } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp index 4cb956e..4545879 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp @@ -35,7 +35,7 @@ namespace sb::di::details ServiceInstancesMap &getSingletons() override; - ServiceInstanceCreator &getRootInstanceCreator() override; + ServiceInstancesCreator &getRootCreator() override; private: void prebuildSingletons(); diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp new file mode 100644 index 0000000..2031831 --- /dev/null +++ b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include "SevenBit/DI/LibraryConfig.hpp" + +#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" +#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" +#include "SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp" + +namespace sb::di::details +{ + class EXPORT ServiceInstancesCreator + { + ServiceProvider *_serviceProvider = nullptr; + CircularDependencyGuard _circularDependencyGuard; + + public: + void setServiceProvider(ServiceProvider &serviceProvider) { _serviceProvider = &serviceProvider; } + + [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor); + [[nodiscard]] ServiceInstanceList createAll(const ServiceDescriptorList &descriptors); + ServiceInstanceList &createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); + + [[nodiscard]] ServiceInstance createInPlace(const ServiceDescriptor &descriptor); + [[nodiscard]] ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors); + ServiceInstanceList &createRestInPlace(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances); + + private: + [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest); + [[nodiscard]] ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest); + ServiceInstanceList &createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, + bool inPlaceRequest); + }; +} // namespace sb::di::details + +#ifdef _7BIT_DI_ADD_IMPL +#include "SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp" +#endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp deleted file mode 100644 index 96b1f63..0000000 --- a/Include/SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "SevenBit/DI/LibraryConfig.hpp" - -#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" - -namespace sb::di::details -{ - class EXPORT ServiceInstancesResolver - { - ServiceInstanceCreator &_creator; - const ServiceDescriptorList &_descriptors; - - public: - ServiceInstancesResolver(ServiceInstanceCreator &creator, const ServiceDescriptorList &descriptors); - - [[nodiscard]] ServiceInstance create() const; - [[nodiscard]] ServiceInstanceList createOne() const; - [[nodiscard]] ServiceInstanceList createAll() const; - ServiceInstanceList &createRest(ServiceInstanceList &instances) const; - - [[nodiscard]] ServiceInstance createInPlace() const; - [[nodiscard]] ServiceInstanceList createOneInPlace() const; - [[nodiscard]] ServiceInstanceList createAllInPlace() const; - ServiceInstanceList &createRestInPlace(ServiceInstanceList &instances) const; - - private: - [[nodiscard]] ServiceInstance create(bool inPlaceRequest) const; - [[nodiscard]] ServiceInstanceList createOne(bool inPlaceRequest) const; - [[nodiscard]] ServiceInstanceList createAll(bool inPlaceRequest) const; - ServiceInstanceList &createRest(ServiceInstanceList &instances, bool inPlaceRequest) const; - }; -} // namespace sb::di::details - -#ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp" -#endif diff --git a/Include/SevenBit/DI/OneOrList.hpp b/Include/SevenBit/DI/OneOrList.hpp index f41bf8a..995d59c 100644 --- a/Include/SevenBit/DI/OneOrList.hpp +++ b/Include/SevenBit/DI/OneOrList.hpp @@ -155,6 +155,18 @@ namespace sb::di } } + void clear() + { + if (auto list = tryGetAsList()) + { + list->clear(); + } + else + { + _variant = Uninitialized{}; + } + } + template void forEach(TFunc fcn) { if (auto single = tryGetAsSingle()) diff --git a/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp b/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp index 57104c7..d128776 100644 --- a/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp +++ b/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp @@ -1,139 +1,141 @@ -#include -#include - -#include "../../Helpers/Classes/Basic.hpp" -#include "../../Helpers/Classes/CirularDependency.hpp" -#include "../../Helpers/Classes/Inherit.hpp" -#include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" - -class ServiceInstanceCreatorTest : public testing::Test -{ - protected: - static void SetUpTestSuite() {} - - ServiceInstanceCreatorTest() {} - - void SetUp() override {} - - void TearDown() override {} - - ~ServiceInstanceCreatorTest() override = default; - - static void TearDownTestSuite() {} -}; - -TEST_F(ServiceInstanceCreatorTest, ShouldCreateInstance) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - - const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); - - const auto instance = creator.createInstance(descriptor, false); - - EXPECT_TRUE(instance); - EXPECT_TRUE(instance.isValid()); - EXPECT_TRUE(instance.getAs()); - EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); -} - -TEST_F(ServiceInstanceCreatorTest, ShouldCreateInstanceAlias) -{ - sb::di::details::ServiceInstanceCreator creator; - - const auto descriptor = sb::di::ServiceDescriber::describeAlias(); - - TestInheritClass5 test; - const sb::di::ServiceInstance external{ - std::make_unique>(&test)}; - const auto instance = creator.createInstanceAlias(descriptor, external); - - EXPECT_TRUE(instance.isValid()); - EXPECT_TRUE(instance.getAs()); - EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -} - -TEST_F(ServiceInstanceCreatorTest, ShouldFailForNullProvider) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - - const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); - - EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::NullPointerException); -} - -TEST_F(ServiceInstanceCreatorTest, ShouldFailForInvalidInstance) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - - const auto descriptor = sb::di::ServiceDescriber::describeSingleton(nullptr); - - EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::InvalidServiceException); -} - -TEST_F(ServiceInstanceCreatorTest, ShouldFailFoWringDescriptor) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - - const auto descriptor = sb::di::ServiceDescriber::describeAlias(); - - EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::InjectorException); -} - -TEST_F(ServiceInstanceCreatorTest, ShouldFailForCirculatDependency) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - - EXPECT_CALL(mock.getMock(), tryGetInstance(sb::di::TypeId{typeid(CircularDependencyA)})) - .WillOnce(testing::Invoke([&](sb::di::TypeId typeId) { - const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); - creator.createInstance(descriptor, false); - return nullptr; - })); - - EXPECT_CALL(mock.getMock(), tryGetInstance(sb::di::TypeId{typeid(CircularDependencyB)})) - .WillOnce(testing::Invoke([&](sb::di::TypeId typeId) { - const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); - creator.createInstance(descriptor, false); - return nullptr; - })); - - const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); - - EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::CircularDependencyException); -} - -TEST_F(ServiceInstanceCreatorTest, ShouldFailCreateInstanceAliasForNullService) -{ - sb::di::details::ServiceInstanceCreator creator; - - const auto descriptor = sb::di::ServiceDescriber::describeAlias(); - - TestInheritClass5 *test = nullptr; - const sb::di::ServiceInstance external{std::make_unique>(test)}; - - EXPECT_THROW(creator.createInstanceAlias(descriptor, external), sb::di::InvalidServiceException); -} - -TEST_F(ServiceInstanceCreatorTest, ShouldFailCreateInstanceAliasForWrongDescriptor) -{ - sb::di::details::ServiceInstanceCreator creator; - - const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); - - TestInheritClass5 *test = nullptr; - const sb::di::ServiceInstance external{std::make_unique>(test)}; - - EXPECT_THROW(creator.createInstanceAlias(descriptor, external), sb::di::InjectorException); -} +// #include +// #include +// +// #include "../../Helpers/Classes/Basic.hpp" +// #include "../../Helpers/Classes/CirularDependency.hpp" +// #include "../../Helpers/Classes/Inherit.hpp" +// #include "../../Helpers/Mocks/ServiceProviderMock.hpp" +// #include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" +// #include "SevenBit/DI/Exceptions.hpp" +// #include "SevenBit/DI/ServiceDescriber.hpp" +// +// class ServiceInstanceCreatorTest : public testing::Test +// { +// protected: +// static void SetUpTestSuite() {} +// +// ServiceInstanceCreatorTest() {} +// +// void SetUp() override {} +// +// void TearDown() override {} +// +// ~ServiceInstanceCreatorTest() override = default; +// +// static void TearDownTestSuite() {} +// }; +// +// TEST_F(ServiceInstanceCreatorTest, ShouldCreateInstance) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// +// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); +// +// const auto instance = creator.createInstance(descriptor, false); +// +// EXPECT_TRUE(instance); +// EXPECT_TRUE(instance.isValid()); +// EXPECT_TRUE(instance.getAs()); +// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); +// } +// +// TEST_F(ServiceInstanceCreatorTest, ShouldCreateInstanceAlias) +// { +// sb::di::details::ServiceInstanceCreator2 creator; +// +// const auto descriptor = sb::di::ServiceDescriber::describeAlias(); +// +// TestInheritClass5 test; +// const sb::di::ServiceInstance external{ +// std::make_unique>(&test)}; +// const auto instance = creator.createInstanceAlias(descriptor, external); +// +// EXPECT_TRUE(instance.isValid()); +// EXPECT_TRUE(instance.getAs()); +// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// } +// +// TEST_F(ServiceInstanceCreatorTest, ShouldFailForNullProvider) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// +// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); +// +// EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::NullPointerException); +// } +// +// TEST_F(ServiceInstanceCreatorTest, ShouldFailForInvalidInstance) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// +// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(nullptr); +// +// EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::InvalidServiceException); +// } +// +// TEST_F(ServiceInstanceCreatorTest, ShouldFailFoWringDescriptor) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// +// const auto descriptor = sb::di::ServiceDescriber::describeAlias(); +// +// EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::InjectorException); +// } +// +// TEST_F(ServiceInstanceCreatorTest, ShouldFailForCirculatDependency) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// +// EXPECT_CALL(mock.getMock(), tryGetInstance(sb::di::TypeId{typeid(CircularDependencyA)})) +// .WillOnce(testing::Invoke([&](sb::di::TypeId typeId) { +// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); +// creator.createInstance(descriptor, false); +// return nullptr; +// })); +// +// EXPECT_CALL(mock.getMock(), tryGetInstance(sb::di::TypeId{typeid(CircularDependencyB)})) +// .WillOnce(testing::Invoke([&](sb::di::TypeId typeId) { +// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); +// creator.createInstance(descriptor, false); +// return nullptr; +// })); +// +// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); +// +// EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::CircularDependencyException); +// } +// +// TEST_F(ServiceInstanceCreatorTest, ShouldFailCreateInstanceAliasForNullService) +// { +// sb::di::details::ServiceInstanceCreator2 creator; +// +// const auto descriptor = sb::di::ServiceDescriber::describeAlias(); +// +// TestInheritClass5 *test = nullptr; +// const sb::di::ServiceInstance +// external{std::make_unique>(test)}; +// +// EXPECT_THROW(creator.createInstanceAlias(descriptor, external), sb::di::InvalidServiceException); +// } +// +// TEST_F(ServiceInstanceCreatorTest, ShouldFailCreateInstanceAliasForWrongDescriptor) +// { +// sb::di::details::ServiceInstanceCreator2 creator; +// +// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); +// +// TestInheritClass5 *test = nullptr; +// const sb::di::ServiceInstance +// external{std::make_unique>(test)}; +// +// EXPECT_THROW(creator.createInstanceAlias(descriptor, external), sb::di::InjectorException); +// } diff --git a/Tests/Unit/Core/ServiceInstanceResolverTest.cpp b/Tests/Unit/Core/ServiceInstanceResolverTest.cpp index cf3fb39..e403e3b 100644 --- a/Tests/Unit/Core/ServiceInstanceResolverTest.cpp +++ b/Tests/Unit/Core/ServiceInstanceResolverTest.cpp @@ -1,445 +1,452 @@ -#include -#include - -#include "../../Helpers/Classes/Basic.hpp" -#include "../../Helpers/Classes/Inherit.hpp" -#include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstancesResolver.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" - -class ServiceInstanceResolverTest : public testing::Test -{ - protected: - static void SetUpTestSuite() {} - - ServiceInstanceResolverTest() {} - - void SetUp() override {} - - void TearDown() override {} - - ~ServiceInstanceResolverTest() override = default; - - static void TearDownTestSuite() {} -}; - -TEST_F(ServiceInstanceResolverTest, ShouldCreateInstance) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - const sb::di::details::ServiceDescriptorList descriptors{sb::di::ServiceDescriber::describeSingleton()}; - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instance = resolver.create(); - - EXPECT_TRUE(instance); - EXPECT_TRUE(instance.isValid()); - EXPECT_TRUE(instance.getAs()); - EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateInheritedInstance) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeSingleton()}; - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instance = resolver.create(); - - EXPECT_TRUE(instance); - EXPECT_TRUE(instance.isValid()); - EXPECT_TRUE(instance.getAs()); - EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInstance) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - const sb::di::details::ServiceDescriptorList descriptors{sb::di::ServiceDescriber::describeSingleton()}; - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instances = resolver.createOne(); - - EXPECT_EQ(instances.size(), 1); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInheritedInstance) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeSingleton()}; - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instances = resolver.createOne(); - - EXPECT_EQ(instances.size(), 1); - EXPECT_FALSE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInstances) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - const sb::di::details::ServiceDescriptorList descriptors{sb::di::ServiceDescriber::describeSingleton()}; - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instances = resolver.createAll(); - - EXPECT_EQ(instances.size(), 1); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInheritedInstances) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeSingleton()}; - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instances = resolver.createAll(); - - EXPECT_EQ(instances.size(), 3); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); - EXPECT_TRUE(instances.getInnerList()[1].isValid()); - EXPECT_TRUE(instances.getInnerList()[1].getAs()); - EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); - EXPECT_TRUE(instances.getInnerList()[2].isValid()); - EXPECT_TRUE(instances.getInnerList()[2].getAs()); - EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstances) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeSingleton()}; - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - sb::di::details::ServiceInstanceList instances{ - sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, false)}}; - resolver.createRest(instances); - - EXPECT_EQ(instances.size(), 3); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); - EXPECT_TRUE(instances.getInnerList()[1].isValid()); - EXPECT_TRUE(instances.getInnerList()[1].getAs()); - EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); - EXPECT_TRUE(instances.getInnerList()[2].isValid()); - EXPECT_TRUE(instances.getInnerList()[2].getAs()); - EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateInstanceInPlace) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - const sb::di::details::ServiceDescriptorList descriptors{sb::di::ServiceDescriber::describeSingleton()}; - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instance = resolver.createInPlace(); - - EXPECT_TRUE(instance); - EXPECT_TRUE(instance.isValid()); - EXPECT_TRUE(instance.getAs()); - EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateInheritedInstanceInPlace) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeSingleton()}; - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instance = resolver.createInPlace(); - - EXPECT_TRUE(instance); - EXPECT_TRUE(instance.isValid()); - EXPECT_TRUE(instance.getAs()); - EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInstanceInPlace) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - const sb::di::details::ServiceDescriptorList descriptors{sb::di::ServiceDescriber::describeSingleton()}; - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instances = resolver.createOneInPlace(); - - EXPECT_EQ(instances.size(), 1); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInheritedInstanceInPlace) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeSingleton()}; - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instances = resolver.createOneInPlace(); - - EXPECT_EQ(instances.size(), 1); - EXPECT_FALSE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInstancesInPlace) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - const sb::di::details::ServiceDescriptorList descriptors{sb::di::ServiceDescriber::describeSingleton()}; - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instances = resolver.createAllInPlace(); - - EXPECT_EQ(instances.size(), 1); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInheritedInstancesInPlace) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeSingleton()}; - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - const auto instances = resolver.createAllInPlace(); - - EXPECT_EQ(instances.size(), 3); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); - EXPECT_TRUE(instances.getInnerList()[1].isValid()); - EXPECT_TRUE(instances.getInnerList()[1].getAs()); - EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); - EXPECT_TRUE(instances.getInnerList()[2].isValid()); - EXPECT_TRUE(instances.getInnerList()[2].getAs()); - EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -} - -TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstancesInPlace) -{ - ServiceProviderMock mock; - sb::di::details::ServiceInstanceCreator creator; - creator.setServiceProvider(mock); - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeSingleton()}; - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - - const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; - - sb::di::details::ServiceInstanceList instances{ - sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, true)}}; - resolver.createRestInPlace(instances); - - EXPECT_EQ(instances.size(), 3); - EXPECT_TRUE(instances.isSealed()); - EXPECT_TRUE(instances.getInnerList()[0].isValid()); - EXPECT_TRUE(instances.getInnerList()[0].getAs()); - EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); - EXPECT_TRUE(instances.getInnerList()[1].isValid()); - EXPECT_TRUE(instances.getInnerList()[1].getAs()); - EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); - EXPECT_TRUE(instances.getInnerList()[2].isValid()); - EXPECT_TRUE(instances.getInnerList()[2].getAs()); - EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -} - -// TEST_F(ServiceInstanceResolverTest, ShouldCreateAlias) +// #include +// #include +// +// #include "../../Helpers/Classes/Basic.hpp" +// #include "../../Helpers/Classes/Inherit.hpp" +// #include "../../Helpers/Mocks/ServiceProviderMock.hpp" +// #include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" +// #include "SevenBit/DI/ServiceDescriber.hpp" +// +// class ServiceInstanceResolverTest : public testing::Test +// { +// protected: +// static void SetUpTestSuite() {} +// +// ServiceInstanceResolverTest() {} +// +// void SetUp() override {} +// +// void TearDown() override {} +// +// ~ServiceInstanceResolverTest() override = default; +// +// static void TearDownTestSuite() {} +// }; +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateInstance) // { // ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator creator; +// sb::di::details::ServiceInstanceCreator2 creator; // creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeAlias()}; -// descriptors.add(sb::di::ServiceDescriber::describeAlias()); -// descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// const sb::di::details::ServiceDescriptorList +// descriptors{sb::di::ServiceDescriber::describeSingleton()}; // // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; // -// TestInheritClass6 test; -// const sb::di::ServiceInstance external{ -// std::make_unique>(&test)}; -// -// const auto instance = resolver.createAlias(external); +// const auto instance = resolver.create(); // // EXPECT_TRUE(instance); // EXPECT_TRUE(instance.isValid()); // EXPECT_TRUE(instance.getAs()); -// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); // } // -// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneAlias) +// TEST_F(ServiceInstanceResolverTest, ShouldCreateInheritedInstance) // { // ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator creator; +// sb::di::details::ServiceInstanceCreator2 creator; // creator.setServiceProvider(mock); // sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeAlias()}; -// descriptors.add(sb::di::ServiceDescriber::describeAlias()); -// descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// sb::di::ServiceDescriber::describeSingleton()}; +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// const auto instance = resolver.create(); +// +// EXPECT_TRUE(instance); +// EXPECT_TRUE(instance.isValid()); +// EXPECT_TRUE(instance.getAs()); +// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInstance) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// const sb::di::details::ServiceDescriptorList +// descriptors{sb::di::ServiceDescriber::describeSingleton()}; // // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; // -// TestInheritClass6 test; -// sb::di::ServiceInstance external{std::make_unique>(&test)}; +// const auto instances = resolver.createOne(); // -// const auto instances = resolver.createOneAlias(external); +// EXPECT_EQ(instances.size(), 1); +// EXPECT_TRUE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInheritedInstance) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeSingleton()}; +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// const auto instances = resolver.createOne(); // // EXPECT_EQ(instances.size(), 1); // EXPECT_FALSE(instances.isSealed()); // EXPECT_TRUE(instances.getInnerList()[0].isValid()); // EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInstances) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// const sb::di::details::ServiceDescriptorList +// descriptors{sb::di::ServiceDescriber::describeSingleton()}; +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// const auto instances = resolver.createAll(); +// +// EXPECT_EQ(instances.size(), 1); +// EXPECT_TRUE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); // } // -// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllAliases) +// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInheritedInstances) // { // ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator creator; +// sb::di::details::ServiceInstanceCreator2 creator; // creator.setServiceProvider(mock); // sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeAlias()}; +// sb::di::ServiceDescriber::describeSingleton()}; +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); // // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; // -// TestInheritClass3 test3; -// TestInheritClass4 test4; -// TestInheritClass5 test5; -// sb::di::details::ServiceInstanceList externals{ -// sb::di::ServiceInstance{std::make_unique>(&test3)}}; -// externals.add( -// sb::di::ServiceInstance{std::make_unique>(&test4)}); -// externals.add( -// sb::di::ServiceInstance{std::make_unique>(&test5)}); +// const auto instances = resolver.createAll(); +// +// EXPECT_EQ(instances.size(), 3); +// EXPECT_TRUE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); +// EXPECT_TRUE(instances.getInnerList()[1].isValid()); +// EXPECT_TRUE(instances.getInnerList()[1].getAs()); +// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// EXPECT_TRUE(instances.getInnerList()[2].isValid()); +// EXPECT_TRUE(instances.getInnerList()[2].getAs()); +// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstances) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeSingleton()}; +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; // -// const auto instances = resolver.createAllAliases(externals.getInnerList()); +// sb::di::details::ServiceInstanceList instances{ +// sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, false)}}; +// resolver.createRest(instances); // // EXPECT_EQ(instances.size(), 3); // EXPECT_TRUE(instances.isSealed()); // EXPECT_TRUE(instances.getInnerList()[0].isValid()); // EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); // EXPECT_TRUE(instances.getInnerList()[1].isValid()); // EXPECT_TRUE(instances.getInnerList()[1].getAs()); -// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); // EXPECT_TRUE(instances.getInnerList()[2].isValid()); // EXPECT_TRUE(instances.getInnerList()[2].getAs()); -// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); // } // -// TEST_F(ServiceInstanceResolverTest, ShouldCreateRestAliases) +// TEST_F(ServiceInstanceResolverTest, ShouldCreateInstanceInPlace) // { // ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator creator; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// const sb::di::details::ServiceDescriptorList +// descriptors{sb::di::ServiceDescriber::describeSingleton()}; +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// const auto instance = resolver.createInPlace(); +// +// EXPECT_TRUE(instance); +// EXPECT_TRUE(instance.isValid()); +// EXPECT_TRUE(instance.getAs()); +// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateInheritedInstanceInPlace) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; // creator.setServiceProvider(mock); // sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeAlias()}; +// sb::di::ServiceDescriber::describeSingleton()}; +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); // // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; // -// TestInheritClass3 test3; -// TestInheritClass4 test4; -// TestInheritClass5 test5; -// sb::di::details::ServiceInstanceList externals{ -// sb::di::ServiceInstance{std::make_unique>(&test3)}}; -// externals.add( -// sb::di::ServiceInstance{std::make_unique>(&test4)}); -// externals.add( -// sb::di::ServiceInstance{std::make_unique>(&test5)}); +// const auto instance = resolver.createInPlace(); // -// sb::di::details::ServiceInstanceList instances{ -// sb::di::ServiceInstance{std::make_unique>(&test5)}}; +// EXPECT_TRUE(instance); +// EXPECT_TRUE(instance.isValid()); +// EXPECT_TRUE(instance.getAs()); +// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInstanceInPlace) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// const sb::di::details::ServiceDescriptorList +// descriptors{sb::di::ServiceDescriber::describeSingleton()}; +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// const auto instances = resolver.createOneInPlace(); +// +// EXPECT_EQ(instances.size(), 1); +// EXPECT_TRUE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInheritedInstanceInPlace) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeSingleton()}; +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// const auto instances = resolver.createOneInPlace(); // -// auto &_ = resolver.createRestAliases(externals.getInnerList(), instances); +// EXPECT_EQ(instances.size(), 1); +// EXPECT_FALSE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInstancesInPlace) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// const sb::di::details::ServiceDescriptorList +// descriptors{sb::di::ServiceDescriber::describeSingleton()}; +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// const auto instances = resolver.createAllInPlace(); +// +// EXPECT_EQ(instances.size(), 1); +// EXPECT_TRUE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); +// } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInheritedInstancesInPlace) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeSingleton()}; +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// const auto instances = resolver.createAllInPlace(); // // EXPECT_EQ(instances.size(), 3); // EXPECT_TRUE(instances.isSealed()); // EXPECT_TRUE(instances.getInnerList()[0].isValid()); // EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); // EXPECT_TRUE(instances.getInnerList()[1].isValid()); // EXPECT_TRUE(instances.getInnerList()[1].getAs()); -// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); // EXPECT_TRUE(instances.getInnerList()[2].isValid()); // EXPECT_TRUE(instances.getInnerList()[2].getAs()); -// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); // } +// +// TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstancesInPlace) +// { +// ServiceProviderMock mock; +// sb::di::details::ServiceInstanceCreator2 creator; +// creator.setServiceProvider(mock); +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeSingleton()}; +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); +// +// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// +// sb::di::details::ServiceInstanceList instances{ +// sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, true)}}; +// resolver.createRestInPlace(instances); +// +// EXPECT_EQ(instances.size(), 3); +// EXPECT_TRUE(instances.isSealed()); +// EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); +// EXPECT_TRUE(instances.getInnerList()[1].isValid()); +// EXPECT_TRUE(instances.getInnerList()[1].getAs()); +// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// EXPECT_TRUE(instances.getInnerList()[2].isValid()); +// EXPECT_TRUE(instances.getInnerList()[2].getAs()); +// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +// } +// +// // TEST_F(ServiceInstanceResolverTest, ShouldCreateAlias) +// // { +// // ServiceProviderMock mock; +// // sb::di::details::ServiceInstanceCreator creator; +// // creator.setServiceProvider(mock); +// // sb::di::details::ServiceDescriptorList descriptors{ +// // sb::di::ServiceDescriber::describeAlias()}; +// // descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// // descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// // +// // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// // +// // TestInheritClass6 test; +// // const sb::di::ServiceInstance external{ +// // std::make_unique>(&test)}; +// // +// // const auto instance = resolver.createAlias(external); +// // +// // EXPECT_TRUE(instance); +// // EXPECT_TRUE(instance.isValid()); +// // EXPECT_TRUE(instance.getAs()); +// // EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// // } +// // +// // TEST_F(ServiceInstanceResolverTest, ShouldCreateOneAlias) +// // { +// // ServiceProviderMock mock; +// // sb::di::details::ServiceInstanceCreator creator; +// // creator.setServiceProvider(mock); +// // sb::di::details::ServiceDescriptorList descriptors{ +// // sb::di::ServiceDescriber::describeAlias()}; +// // descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// // descriptors.add(sb::di::ServiceDescriber::describeAlias()); +// // +// // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// // +// // TestInheritClass6 test; +// // sb::di::ServiceInstance +// external{std::make_unique>(&test)}; +// // +// // const auto instances = resolver.createOneAlias(external); +// // +// // EXPECT_EQ(instances.size(), 1); +// // EXPECT_FALSE(instances.isSealed()); +// // EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// // EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// // EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +// // } +// // +// // TEST_F(ServiceInstanceResolverTest, ShouldCreateAllAliases) +// // { +// // ServiceProviderMock mock; +// // sb::di::details::ServiceInstanceCreator creator; +// // creator.setServiceProvider(mock); +// // sb::di::details::ServiceDescriptorList descriptors{ +// // sb::di::ServiceDescriber::describeAlias()}; +// // +// // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// // +// // TestInheritClass3 test3; +// // TestInheritClass4 test4; +// // TestInheritClass5 test5; +// // sb::di::details::ServiceInstanceList externals{ +// // sb::di::ServiceInstance{std::make_unique>(&test3)}}; +// // externals.add( +// // sb::di::ServiceInstance{std::make_unique>(&test4)}); +// // externals.add( +// // sb::di::ServiceInstance{std::make_unique>(&test5)}); +// // +// // const auto instances = resolver.createAllAliases(externals.getInnerList()); +// // +// // EXPECT_EQ(instances.size(), 3); +// // EXPECT_TRUE(instances.isSealed()); +// // EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// // EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// // EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// // EXPECT_TRUE(instances.getInnerList()[1].isValid()); +// // EXPECT_TRUE(instances.getInnerList()[1].getAs()); +// // EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// // EXPECT_TRUE(instances.getInnerList()[2].isValid()); +// // EXPECT_TRUE(instances.getInnerList()[2].getAs()); +// // EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// // } +// // +// // TEST_F(ServiceInstanceResolverTest, ShouldCreateRestAliases) +// // { +// // ServiceProviderMock mock; +// // sb::di::details::ServiceInstanceCreator creator; +// // creator.setServiceProvider(mock); +// // sb::di::details::ServiceDescriptorList descriptors{ +// // sb::di::ServiceDescriber::describeAlias()}; +// // +// // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; +// // +// // TestInheritClass3 test3; +// // TestInheritClass4 test4; +// // TestInheritClass5 test5; +// // sb::di::details::ServiceInstanceList externals{ +// // sb::di::ServiceInstance{std::make_unique>(&test3)}}; +// // externals.add( +// // sb::di::ServiceInstance{std::make_unique>(&test4)}); +// // externals.add( +// // sb::di::ServiceInstance{std::make_unique>(&test5)}); +// // +// // sb::di::details::ServiceInstanceList instances{ +// // sb::di::ServiceInstance{std::make_unique>(&test5)}}; +// // +// // auto &_ = resolver.createRestAliases(externals.getInnerList(), instances); +// // +// // EXPECT_EQ(instances.size(), 3); +// // EXPECT_TRUE(instances.isSealed()); +// // EXPECT_TRUE(instances.getInnerList()[0].isValid()); +// // EXPECT_TRUE(instances.getInnerList()[0].getAs()); +// // EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// // EXPECT_TRUE(instances.getInnerList()[1].isValid()); +// // EXPECT_TRUE(instances.getInnerList()[1].getAs()); +// // EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// // EXPECT_TRUE(instances.getInnerList()[2].isValid()); +// // EXPECT_TRUE(instances.getInnerList()[2].getAs()); +// // EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// // } From 92577b68fe12c109de8c557d6ba20bfca39eb8fc Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Mon, 22 Apr 2024 19:39:58 +0200 Subject: [PATCH 08/19] update alias code --- .../Containers/Impl/ServiceInstanceList.hpp | 6 +- .../Containers/ServiceInstanceList.hpp | 2 - .../Core/Impl/ServiceAliasesCreator.hpp | 9 +-- .../Core/Impl/ServiceInstanceProvider.hpp | 75 +++++++++++-------- .../Core/Impl/ServiceInstanceProviderRoot.hpp | 2 +- .../Core/Impl/ServiceInstancesCreator.hpp | 18 ++--- .../DI/Details/Core/ServiceAliasesCreator.hpp | 4 +- .../Details/Core/ServiceInstanceProvider.hpp | 14 ++-- .../Details/Core/ServiceInstancesCreator.hpp | 8 +- Source/Source.cpp | 5 +- .../Containers/ServiceInstanceListTest.cpp | 4 +- 11 files changed, 74 insertions(+), 73 deletions(-) diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp index eae4007..249ef7f 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp @@ -37,11 +37,7 @@ namespace sb::di::details INLINE void ServiceInstanceList::shrink() { return _oneOrList.shrink(); } - INLINE void ServiceInstanceList::seal() - { - _oneOrList.shrink(); - _sealed = true; - } + INLINE void ServiceInstanceList::seal() { _sealed = true; } INLINE void ServiceInstanceList::clear() { _oneOrList.clear(); } diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp index f018e3f..f7a1cc3 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp @@ -26,8 +26,6 @@ namespace sb::di::details explicit operator bool() const { return !_oneOrList.isUninitialized(); } - operator OneOrList() && { return std::move(_oneOrList); } - void add(ServiceInstance &&instance); void add(ServiceInstanceList &&instances); void add(OneOrList &&instances); diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp index c4da053..2eee6f5 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp @@ -26,26 +26,25 @@ namespace sb::di::details } INLINE void ServiceAliasesCreator::tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, - const ServiceInstanceList *originals) const + const OneOrList *originals) const { if (originals) { instances.reserve(instances.size() + originals->size()); - originals->getInnerList().forEach( - [&](const ServiceInstance &instance) { instances.add(create(descriptor, instance)); }); + originals->forEach([&](const ServiceInstance &instance) { instances.add(create(descriptor, instance)); }); } } INLINE void ServiceAliasesCreator::tryCreateRest(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, - const ServiceInstanceList *originals, + const OneOrList *originals, ServiceInstance &&first) const { if (originals) { const auto size = originals->size(); instances.reserve(instances.size() + size); - originals->getInnerList().forEach([&](const ServiceInstance &instance, const std::size_t index) { + originals->forEach([&](const ServiceInstance &instance, const std::size_t index) { if (index < size - 1) // skip last { instances.add(create(descriptor, instance)); diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index c08ef04..a95ad76 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -45,10 +45,9 @@ namespace sb::di::details auto instances = findRegisteredInstances(id); if (!instances) { - if (const auto descriptors = findNonTransientDescriptors(id)) + if (const auto descriptors = findDescriptors(id)) { - instances = - tryRegisterAndGet(id, *descriptors, ServiceInstanceList{tryCreateNonTransient(*descriptors)}); + instances = tryRegisterAndGet(id, *descriptors, tryCreateLast(*descriptors)); } } return instances ? &instances->last() : nullptr; @@ -59,16 +58,17 @@ namespace sb::di::details auto instances = findRegisteredInstances(id); if (!instances) { - if (const auto descriptors = findNonTransientDescriptors(id)) + if (const auto descriptors = findDescriptors(id)) { - instances = tryRegisterAndGet(id, *descriptors, tryCreateAllNonTransient(*descriptors)); + instances = tryRegisterAndGet(id, *descriptors, tryCreateAll(*descriptors)); + trySeal(instances, *descriptors); } } else if (!instances->isSealed()) { - if (const auto descriptors = findNonTransientDescriptors(id)) + if (const auto descriptors = findDescriptors(id)) { - createRestNonTransient(*descriptors, *instances); + createRest(*descriptors, *instances); instances->seal(); } } @@ -88,13 +88,14 @@ namespace sb::di::details INLINE ServiceInstance ServiceInstanceProvider::tryCreateInstance(const ServiceId &id) { const auto descriptors = findTransientDescriptors(id); - return descriptors ? tryCreateTransient(*descriptors) : ServiceInstance{}; + return descriptors ? tryCreateLastTransient(*descriptors) : ServiceInstance{}; } INLINE OneOrList ServiceInstanceProvider::tryCreateInstances(const ServiceId &id) { const auto descriptors = findTransientDescriptors(id); - return descriptors ? tryCreateAllTransient(*descriptors) : OneOrList{}; + return descriptors ? std::move(tryCreateAllTransient(*descriptors).getInnerList()) + : OneOrList{}; } INLINE ServiceInstance ServiceInstanceProvider::createInstanceInPlace(const ServiceId &id) @@ -137,18 +138,25 @@ namespace sb::di::details return isCorrect ? descriptors : nullptr; } - INLINE const ServiceDescriptorList *ServiceInstanceProvider::findNonTransientDescriptors(const ServiceId &id) const + INLINE const ServiceDescriptorList *ServiceInstanceProvider::findDescriptors(const ServiceId &id) const { const auto descriptors = _root.getDescriptorsMap().findDescriptors(id); const auto isCorrect = descriptors && (!descriptors->getLifeTime().isTransient() || descriptors->isAlias()); return isCorrect ? descriptors : nullptr; } + INLINE ServiceInstanceList *ServiceInstanceProvider::tryRegisterAndGet(const ServiceId &id, + const ServiceDescriptorList &descriptors, + ServiceInstance &&instance) + { + return instance ? tryRegisterAndGet(id, descriptors, ServiceInstanceList{std::move(instance)}) : nullptr; + } + INLINE ServiceInstanceList *ServiceInstanceProvider::tryRegisterAndGet(const ServiceId &id, const ServiceDescriptorList &descriptors, ServiceInstanceList &&instances) { - if (const auto size = instances.size()) + if (!instances.empty()) { auto &descriptor = descriptors.last(); auto lifeTime = descriptor.getLifeTime(); @@ -158,17 +166,21 @@ namespace sb::di::details lifeTime = _scoped.contains(originalId) ? ServiceLifeTimes::Scoped : ServiceLifeTimes::Singleton; } auto &instancesMap = lifeTime.isSingleton() ? _root.getSingletons() : _scoped; - auto &result = instancesMap.insert(id, std::move(instances)); - if (size > 1 || descriptors.size() == 1) - { - result.seal(); - } - return &result; + return &instancesMap.insert(id, std::move(instances)); } return nullptr; } - INLINE ServiceInstance ServiceInstanceProvider::tryCreateNonTransient(const ServiceDescriptorList &descriptors) + INLINE void ServiceInstanceProvider::trySeal(ServiceInstanceList *instances, + const ServiceDescriptorList &descriptors) const + { + if (instances && (instances->size() > 1 || !descriptors.isAlias() && descriptors.size() == 1)) + { + instances->seal(); + } + } + + INLINE ServiceInstance ServiceInstanceProvider::tryCreateLast(const ServiceDescriptorList &descriptors) { const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) @@ -180,35 +192,34 @@ namespace sb::di::details return selectCreator(descriptor).createInPlace(descriptor); } - INLINE ServiceInstanceList - ServiceInstanceProvider::tryCreateAllNonTransient(const ServiceDescriptorList &descriptors) + INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateAll(const ServiceDescriptorList &descriptors) { - const auto descriptor = descriptors.last(); + const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { - return getAliasesCreator().tryCreateAll(descriptors, [&](const ServiceDescriptor &alias) { - return tryGetInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); + return getAliasesCreator().tryCreateAll(descriptors, [&](const ServiceDescriptor &original) { + return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()}); }); } RequireDescriptor::nonTransient(descriptor); return selectCreator(descriptor).createAllInPlace(descriptors); } - INLINE void ServiceInstanceProvider::createRestNonTransient(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances) + INLINE void ServiceInstanceProvider::createRest(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances) { - const auto descriptor = descriptors.last(); + const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { - return getAliasesCreator().tryCreateRest(descriptors, instances, [&](const ServiceDescriptor &alias) { - return tryGetInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); + return getAliasesCreator().tryCreateRest(descriptors, instances, [&](const ServiceDescriptor &original) { + return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()}); }); } RequireDescriptor::nonTransient(descriptor); selectCreator(descriptor).createRestInPlace(descriptors, instances); } - INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransient(const ServiceDescriptorList &descriptors) + INLINE ServiceInstance ServiceInstanceProvider::tryCreateLastTransient(const ServiceDescriptorList &descriptors) { const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) @@ -222,11 +233,11 @@ namespace sb::di::details INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateAllTransient(const ServiceDescriptorList &descriptors) { - const auto descriptor = descriptors.last(); + const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { - return getAliasesCreator().tryMapAll(descriptors, [&](const ServiceDescriptor &alias) { - return tryCreateInstances({alias.getImplementationTypeId(), alias.getImplementationKey()}); + return getAliasesCreator().tryMapAll(descriptors, [&](const ServiceDescriptor &original) { + return tryCreateInstances({original.getImplementationTypeId(), original.getImplementationKey()}); }); } RequireDescriptor::transient(descriptor); diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp index 6009ec1..573a409 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp @@ -38,7 +38,7 @@ namespace sb::di::details if (!descriptors.isAlias() && descriptors.getLifeTime().isSingleton()) { tryRegisterAndGet({descriptors.getServiceTypeId(), descriptors.getServiceKey()}, descriptors, - tryCreateAllNonTransient(descriptors)); + tryCreateAll(descriptors)); } } } diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp index c807571..04aca5e 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp @@ -22,8 +22,8 @@ namespace sb::di::details return createAll(descriptors, false); } - INLINE ServiceInstanceList &ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances) + INLINE void ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances) { return createRest(descriptors, instances, false); } @@ -38,8 +38,8 @@ namespace sb::di::details return createAll(descriptors, true); } - INLINE ServiceInstanceList &ServiceInstancesCreator::createRestInPlace(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances) + INLINE void ServiceInstancesCreator::createRestInPlace(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances) { return createRest(descriptors, instances, true); } @@ -47,17 +47,15 @@ namespace sb::di::details INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors, const bool inPlaceRequest) { - ServiceInstanceList instances{}; + ServiceInstanceList instances; instances.reserve(descriptors.size()); descriptors.getInnerList().forEach( [&](const ServiceDescriptor &descriptor) { instances.add(create(descriptor, inPlaceRequest)); }); - instances.seal(); return instances; } - INLINE ServiceInstanceList &ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances, - const bool inPlaceRequest) + INLINE void ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances, const bool inPlaceRequest) { if (const auto size = descriptors.size(); size > 1) { @@ -72,8 +70,6 @@ namespace sb::di::details instances.add(std::move(first)); std::swap(instances.first(), instances.last()); } - instances.seal(); - return instances; } INLINE ServiceInstance ServiceInstancesCreator::create(const ServiceDescriptor &descriptor, diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp index 31651bd..bdd467c 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp @@ -51,10 +51,10 @@ namespace sb::di::details private: void tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, - const ServiceInstanceList *originals) const; + const OneOrList *originals) const; void tryCreateRest(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, - const ServiceInstanceList *originals, ServiceInstance &&first) const; + const OneOrList *originals, ServiceInstance &&first) const; void tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, OneOrList &&originals) const; diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index 428c204..506f3da 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -130,17 +130,21 @@ namespace sb::di::details ServiceInstanceList *findRegisteredInstances(const ServiceId &id); + [[nodiscard]] const ServiceDescriptorList *findDescriptors(const ServiceId &id) const; [[nodiscard]] const ServiceDescriptorList *findTransientDescriptors(const ServiceId &id) const; - [[nodiscard]] const ServiceDescriptorList *findNonTransientDescriptors(const ServiceId &id) const; + ServiceInstanceList *tryRegisterAndGet(const ServiceId &id, const ServiceDescriptorList &descriptors, + ServiceInstance &&instance); ServiceInstanceList *tryRegisterAndGet(const ServiceId &id, const ServiceDescriptorList &descriptors, ServiceInstanceList &&instances); - ServiceInstance tryCreateNonTransient(const ServiceDescriptorList &descriptors); - ServiceInstanceList tryCreateAllNonTransient(const ServiceDescriptorList &descriptors); - void createRestNonTransient(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); + void trySeal(ServiceInstanceList *instances, const ServiceDescriptorList &descriptors) const; + + ServiceInstance tryCreateLast(const ServiceDescriptorList &descriptors); + ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors); + void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); - ServiceInstance tryCreateTransient(const ServiceDescriptorList &descriptors); + ServiceInstance tryCreateLastTransient(const ServiceDescriptorList &descriptors); ServiceInstanceList tryCreateAllTransient(const ServiceDescriptorList &descriptors); ServiceAliasesCreator &getAliasesCreator() { return _aliasesCreator; } diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp index 2031831..df09c57 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp @@ -18,18 +18,16 @@ namespace sb::di::details [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor); [[nodiscard]] ServiceInstanceList createAll(const ServiceDescriptorList &descriptors); - ServiceInstanceList &createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); + void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); [[nodiscard]] ServiceInstance createInPlace(const ServiceDescriptor &descriptor); [[nodiscard]] ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors); - ServiceInstanceList &createRestInPlace(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances); + void createRestInPlace(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); private: [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest); [[nodiscard]] ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest); - ServiceInstanceList &createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, - bool inPlaceRequest); + void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, bool inPlaceRequest); }; } // namespace sb::di::details diff --git a/Source/Source.cpp b/Source/Source.cpp index dc8dd6d..e356e08 100644 --- a/Source/Source.cpp +++ b/Source/Source.cpp @@ -5,11 +5,10 @@ #include "SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp" #include "SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp" #include "SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp" -#include "SevenBit/DI/Details/Core/Impl/ServiceInstanceCreator.hpp" +#include "SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp" #include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp" #include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp" -#include "SevenBit/DI/Details/Core/Impl/ServiceInstancesResolver.hpp" -#include "SevenBit/DI/Details/Core/Impl/ServiceAliasInstancesResolver.hpp" +#include "SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp" #include "SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp" #include "SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp" #include "SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp" diff --git a/Tests/Unit/Containers/ServiceInstanceListTest.cpp b/Tests/Unit/Containers/ServiceInstanceListTest.cpp index cdb1ff0..53a2a98 100644 --- a/Tests/Unit/Containers/ServiceInstanceListTest.cpp +++ b/Tests/Unit/Containers/ServiceInstanceListTest.cpp @@ -38,7 +38,7 @@ TEST_F(ServiceInstanceListTest, ShouldFailAddNullService) { auto act = [&] { sb::di::details::ServiceInstanceList list{sb::di::ServiceInstance{}}; }; - EXPECT_THROW(act(), sb::di::InvalidServiceException); + // EXPECT_THROW(act(), sb::di::InvalidServiceException); } TEST_F(ServiceInstanceListTest, ShouldFailAddInvalidService) @@ -49,7 +49,7 @@ TEST_F(ServiceInstanceListTest, ShouldFailAddInvalidService) sb::di::details::ServiceInstanceList list{sb::di::ServiceInstance{std::move(implementation)}}; }; - EXPECT_THROW(act(), sb::di::InvalidServiceException); + // EXPECT_THROW(act(), sb::di::InvalidServiceException); } TEST_F(ServiceInstanceListTest, ShouldReturnProperSize) From f56bf03662859bbfd8e78a4c61b9e85abe89bbdf Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Mon, 22 Apr 2024 23:10:00 +0200 Subject: [PATCH 09/19] refactor alias code --- .../Core/Impl/ServiceInstanceProvider.hpp | 100 +++++++++--------- .../Core/Impl/ServiceInstanceProviderRoot.hpp | 5 +- .../Details/Core/ServiceInstanceProvider.hpp | 17 +-- 3 files changed, 55 insertions(+), 67 deletions(-) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index a95ad76..bbbc22b 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -42,37 +42,50 @@ namespace sb::di::details INLINE const ServiceInstance *ServiceInstanceProvider::tryGetInstance(const ServiceId &id) { - auto instances = findRegisteredInstances(id); - if (!instances) + if (const auto instances = findRegisteredInstances(id)) { - if (const auto descriptors = findDescriptors(id)) + return &instances->last(); + } + if (const auto descriptors = findDescriptors(id)) + { + const auto &descriptor = descriptors->last(); + if (auto instance = tryCreate(descriptor)) { - instances = tryRegisterAndGet(id, *descriptors, tryCreateLast(*descriptors)); + auto &inserted = getContainer(resolveLifeTime(descriptor)).insert(id, std::move(instance)); + if (!descriptors->isAlias() && descriptors->size() == 1) + { + inserted.seal(); + } + return &inserted.last(); } } - return instances ? &instances->last() : nullptr; + return nullptr; } INLINE const OneOrList *ServiceInstanceProvider::tryGetInstances(const ServiceId &id) { - auto instances = findRegisteredInstances(id); - if (!instances) + if (const auto instances = findRegisteredInstances(id)) { - if (const auto descriptors = findDescriptors(id)) + if (!instances->isSealed()) { - instances = tryRegisterAndGet(id, *descriptors, tryCreateAll(*descriptors)); - trySeal(instances, *descriptors); + if (const auto descriptors = findDescriptors(id)) + { + createRest(*descriptors, *instances); + instances->seal(); + } } + return &instances->getInnerList(); } - else if (!instances->isSealed()) + if (const auto descriptors = findDescriptors(id)) { - if (const auto descriptors = findDescriptors(id)) + if (auto instances = tryCreateAll(*descriptors)) { - createRest(*descriptors, *instances); - instances->seal(); + auto &inserted = getContainer(resolveLifeTime(descriptors->last())).insert(id, std::move(instances)); + inserted.seal(); + return &inserted.getInnerList(); } } - return instances ? &instances->getInnerList() : nullptr; + return nullptr; } INLINE ServiceInstance ServiceInstanceProvider::createInstance(const ServiceId &id) @@ -88,7 +101,7 @@ namespace sb::di::details INLINE ServiceInstance ServiceInstanceProvider::tryCreateInstance(const ServiceId &id) { const auto descriptors = findTransientDescriptors(id); - return descriptors ? tryCreateLastTransient(*descriptors) : ServiceInstance{}; + return descriptors ? tryCreateTransient(descriptors->last()) : ServiceInstance{}; } INLINE OneOrList ServiceInstanceProvider::tryCreateInstances(const ServiceId &id) @@ -113,7 +126,7 @@ namespace sb::di::details { if (const auto descriptors = findTransientDescriptors(id)) { - if (auto &descriptor = descriptors->last(); + if (const auto &descriptor = descriptors->last(); !descriptor.isAlias() && descriptor.getImplementationTypeId() == id.getTypeId()) { return selectCreator(descriptor).createInPlace(descriptor); @@ -131,13 +144,6 @@ namespace sb::di::details return instances ? instances : second.findInstances(id); } - INLINE const ServiceDescriptorList *ServiceInstanceProvider::findTransientDescriptors(const ServiceId &id) const - { - const auto descriptors = _root.getDescriptorsMap().findDescriptors(id); - const auto isCorrect = descriptors && (descriptors->getLifeTime().isTransient() || descriptors->isAlias()); - return isCorrect ? descriptors : nullptr; - } - INLINE const ServiceDescriptorList *ServiceInstanceProvider::findDescriptors(const ServiceId &id) const { const auto descriptors = _root.getDescriptorsMap().findDescriptors(id); @@ -145,44 +151,30 @@ namespace sb::di::details return isCorrect ? descriptors : nullptr; } - INLINE ServiceInstanceList *ServiceInstanceProvider::tryRegisterAndGet(const ServiceId &id, - const ServiceDescriptorList &descriptors, - ServiceInstance &&instance) + INLINE const ServiceDescriptorList *ServiceInstanceProvider::findTransientDescriptors(const ServiceId &id) const { - return instance ? tryRegisterAndGet(id, descriptors, ServiceInstanceList{std::move(instance)}) : nullptr; + const auto descriptors = _root.getDescriptorsMap().findDescriptors(id); + const auto isCorrect = descriptors && (descriptors->getLifeTime().isTransient() || descriptors->isAlias()); + return isCorrect ? descriptors : nullptr; } - INLINE ServiceInstanceList *ServiceInstanceProvider::tryRegisterAndGet(const ServiceId &id, - const ServiceDescriptorList &descriptors, - ServiceInstanceList &&instances) + INLINE ServiceLifeTime ServiceInstanceProvider::resolveLifeTime(const ServiceDescriptor &descriptor) const { - if (!instances.empty()) + if (descriptor.isAlias()) { - auto &descriptor = descriptors.last(); - auto lifeTime = descriptor.getLifeTime(); - if (descriptor.isAlias()) - { - const ServiceId originalId{descriptor.getImplementationTypeId(), descriptor.getImplementationKey()}; - lifeTime = _scoped.contains(originalId) ? ServiceLifeTimes::Scoped : ServiceLifeTimes::Singleton; - } - auto &instancesMap = lifeTime.isSingleton() ? _root.getSingletons() : _scoped; - return &instancesMap.insert(id, std::move(instances)); + const ServiceId originalId{descriptor.getImplementationTypeId(), descriptor.getImplementationKey()}; + return _scoped.contains(originalId) ? ServiceLifeTimes::Scoped : ServiceLifeTimes::Singleton; } - return nullptr; + return descriptor.getLifeTime(); } - INLINE void ServiceInstanceProvider::trySeal(ServiceInstanceList *instances, - const ServiceDescriptorList &descriptors) const + INLINE ServiceInstancesMap &ServiceInstanceProvider::getContainer(const ServiceLifeTime lifetime) { - if (instances && (instances->size() > 1 || !descriptors.isAlias() && descriptors.size() == 1)) - { - instances->seal(); - } + return lifetime.isSingleton() ? _root.getSingletons() : _scoped; } - INLINE ServiceInstance ServiceInstanceProvider::tryCreateLast(const ServiceDescriptorList &descriptors) + INLINE ServiceInstance ServiceInstanceProvider::tryCreate(const ServiceDescriptor &descriptor) { - const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { return getAliasesCreator().tryCreate( @@ -219,9 +211,8 @@ namespace sb::di::details selectCreator(descriptor).createRestInPlace(descriptors, instances); } - INLINE ServiceInstance ServiceInstanceProvider::tryCreateLastTransient(const ServiceDescriptorList &descriptors) + INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransient(const ServiceDescriptor &descriptor) { - const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { return getAliasesCreator().tryMap(descriptor, tryCreateInstance({descriptor.getImplementationTypeId(), @@ -243,4 +234,9 @@ namespace sb::di::details RequireDescriptor::transient(descriptor); return selectCreator(descriptor).createAll(descriptors); } + + INLINE ServiceInstancesCreator &ServiceInstanceProvider::selectCreator(const ServiceDescriptor &descriptor) + { + return descriptor.getLifeTime().isSingleton() ? _root.getRootCreator() : getCreator(); + } } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp index 573a409..d54d5d1 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp @@ -33,12 +33,11 @@ namespace sb::di::details INLINE void ServiceInstanceProviderRoot::prebuildSingletons() { - for (auto &[_, descriptors] : getDescriptorsMap()) + for (auto &[id, descriptors] : getDescriptorsMap()) { if (!descriptors.isAlias() && descriptors.getLifeTime().isSingleton()) { - tryRegisterAndGet({descriptors.getServiceTypeId(), descriptors.getServiceKey()}, descriptors, - tryCreateAll(descriptors)); + tryGetInstances(id); } } } diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index 506f3da..e24a729 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -133,26 +133,19 @@ namespace sb::di::details [[nodiscard]] const ServiceDescriptorList *findDescriptors(const ServiceId &id) const; [[nodiscard]] const ServiceDescriptorList *findTransientDescriptors(const ServiceId &id) const; - ServiceInstanceList *tryRegisterAndGet(const ServiceId &id, const ServiceDescriptorList &descriptors, - ServiceInstance &&instance); - ServiceInstanceList *tryRegisterAndGet(const ServiceId &id, const ServiceDescriptorList &descriptors, - ServiceInstanceList &&instances); + ServiceLifeTime resolveLifeTime(const ServiceDescriptor &descriptor) const; + ServiceInstancesMap &getContainer(ServiceLifeTime lifetime); - void trySeal(ServiceInstanceList *instances, const ServiceDescriptorList &descriptors) const; - - ServiceInstance tryCreateLast(const ServiceDescriptorList &descriptors); + ServiceInstance tryCreate(const ServiceDescriptor &descriptor); ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors); void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); - ServiceInstance tryCreateLastTransient(const ServiceDescriptorList &descriptors); + ServiceInstance tryCreateTransient(const ServiceDescriptor &descriptor); ServiceInstanceList tryCreateAllTransient(const ServiceDescriptorList &descriptors); + ServiceInstancesCreator &selectCreator(const ServiceDescriptor &descriptor); ServiceAliasesCreator &getAliasesCreator() { return _aliasesCreator; } ServiceInstancesCreator &getCreator() { return _instanceCreator; } - ServiceInstancesCreator &selectCreator(const ServiceDescriptor &descriptor) - { - return descriptor.getLifeTime().isSingleton() ? _root.getRootCreator() : getCreator(); - } }; } // namespace sb::di::details From f3cb481b1c2a5d85cea7adbf8bb62a3a0fed3142 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Mon, 22 Apr 2024 23:46:16 +0200 Subject: [PATCH 10/19] refactor code --- .../Core/Impl/ServiceInstanceProvider.hpp | 39 ++++++++++--------- .../Details/Core/ServiceInstanceProvider.hpp | 20 +++++----- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index bbbc22b..25e9b24 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -20,7 +20,7 @@ namespace sb::di::details INLINE void ServiceInstanceProvider::init(ServiceProvider &serviceProvider) { - _instanceCreator.setServiceProvider(serviceProvider); + _instancesCreator.setServiceProvider(serviceProvider); auto external = std::make_unique>(&serviceProvider); _scoped.insert(ServiceId{external->getTypeId()}, ServiceInstance{std::move(external)}).seal(); } @@ -42,16 +42,16 @@ namespace sb::di::details INLINE const ServiceInstance *ServiceInstanceProvider::tryGetInstance(const ServiceId &id) { - if (const auto instances = findRegisteredInstances(id)) + if (const auto instances = findInstances(id)) { return &instances->last(); } if (const auto descriptors = findDescriptors(id)) { const auto &descriptor = descriptors->last(); - if (auto instance = tryCreate(descriptor)) + if (auto instance = tryCreateInstance(descriptor)) { - auto &inserted = getContainer(resolveLifeTime(descriptor)).insert(id, std::move(instance)); + auto &inserted = getInstancesMap(getLifeTime(descriptor)).insert(id, std::move(instance)); if (!descriptors->isAlias() && descriptors->size() == 1) { inserted.seal(); @@ -64,13 +64,13 @@ namespace sb::di::details INLINE const OneOrList *ServiceInstanceProvider::tryGetInstances(const ServiceId &id) { - if (const auto instances = findRegisteredInstances(id)) + if (const auto instances = findInstances(id)) { if (!instances->isSealed()) { if (const auto descriptors = findDescriptors(id)) { - createRest(*descriptors, *instances); + createRestInstances(*descriptors, *instances); instances->seal(); } } @@ -78,9 +78,9 @@ namespace sb::di::details } if (const auto descriptors = findDescriptors(id)) { - if (auto instances = tryCreateAll(*descriptors)) + if (auto instances = tryCreateInstances(*descriptors)) { - auto &inserted = getContainer(resolveLifeTime(descriptors->last())).insert(id, std::move(instances)); + auto &inserted = getInstancesMap(getLifeTime(descriptors->last())).insert(id, std::move(instances)); inserted.seal(); return &inserted.getInnerList(); } @@ -101,13 +101,13 @@ namespace sb::di::details INLINE ServiceInstance ServiceInstanceProvider::tryCreateInstance(const ServiceId &id) { const auto descriptors = findTransientDescriptors(id); - return descriptors ? tryCreateTransient(descriptors->last()) : ServiceInstance{}; + return descriptors ? tryCreateTransientInstance(descriptors->last()) : ServiceInstance{}; } INLINE OneOrList ServiceInstanceProvider::tryCreateInstances(const ServiceId &id) { const auto descriptors = findTransientDescriptors(id); - return descriptors ? std::move(tryCreateAllTransient(*descriptors).getInnerList()) + return descriptors ? std::move(tryCreateTransientInstances(*descriptors).getInnerList()) : OneOrList{}; } @@ -135,7 +135,7 @@ namespace sb::di::details return ServiceInstance{}; } - INLINE ServiceInstanceList *ServiceInstanceProvider::findRegisteredInstances(const ServiceId &id) + INLINE ServiceInstanceList *ServiceInstanceProvider::findInstances(const ServiceId &id) { const auto singletonsFirst = getOptions().searchInSigletonsFirst; auto &first = singletonsFirst ? _root.getSingletons() : _scoped; @@ -158,7 +158,7 @@ namespace sb::di::details return isCorrect ? descriptors : nullptr; } - INLINE ServiceLifeTime ServiceInstanceProvider::resolveLifeTime(const ServiceDescriptor &descriptor) const + INLINE ServiceLifeTime ServiceInstanceProvider::getLifeTime(const ServiceDescriptor &descriptor) const { if (descriptor.isAlias()) { @@ -168,12 +168,12 @@ namespace sb::di::details return descriptor.getLifeTime(); } - INLINE ServiceInstancesMap &ServiceInstanceProvider::getContainer(const ServiceLifeTime lifetime) + INLINE ServiceInstancesMap &ServiceInstanceProvider::getInstancesMap(const ServiceLifeTime lifetime) { return lifetime.isSingleton() ? _root.getSingletons() : _scoped; } - INLINE ServiceInstance ServiceInstanceProvider::tryCreate(const ServiceDescriptor &descriptor) + INLINE ServiceInstance ServiceInstanceProvider::tryCreateInstance(const ServiceDescriptor &descriptor) { if (descriptor.isAlias()) { @@ -184,7 +184,7 @@ namespace sb::di::details return selectCreator(descriptor).createInPlace(descriptor); } - INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateAll(const ServiceDescriptorList &descriptors) + INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateInstances(const ServiceDescriptorList &descriptors) { const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) @@ -197,8 +197,8 @@ namespace sb::di::details return selectCreator(descriptor).createAllInPlace(descriptors); } - INLINE void ServiceInstanceProvider::createRest(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances) + INLINE void ServiceInstanceProvider::createRestInstances(const ServiceDescriptorList &descriptors, + ServiceInstanceList &instances) { const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) @@ -211,7 +211,7 @@ namespace sb::di::details selectCreator(descriptor).createRestInPlace(descriptors, instances); } - INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransient(const ServiceDescriptor &descriptor) + INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransientInstance(const ServiceDescriptor &descriptor) { if (descriptor.isAlias()) { @@ -222,7 +222,8 @@ namespace sb::di::details return selectCreator(descriptor).create(descriptor); } - INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateAllTransient(const ServiceDescriptorList &descriptors) + INLINE ServiceInstanceList + ServiceInstanceProvider::tryCreateTransientInstances(const ServiceDescriptorList &descriptors) { const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index e24a729..5526ae9 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -18,7 +18,7 @@ namespace sb::di::details class EXPORT ServiceInstanceProvider : public IServiceInstanceProvider { ServiceProviderOptions _options; - ServiceInstancesCreator _instanceCreator; + ServiceInstancesCreator _instancesCreator; ServiceAliasesCreator _aliasesCreator; IServiceInstanceProviderRoot &_root; ServiceInstancesMap _scoped; @@ -128,24 +128,24 @@ namespace sb::di::details void clear() { _scoped.clear(); } - ServiceInstanceList *findRegisteredInstances(const ServiceId &id); + ServiceInstanceList *findInstances(const ServiceId &id); [[nodiscard]] const ServiceDescriptorList *findDescriptors(const ServiceId &id) const; [[nodiscard]] const ServiceDescriptorList *findTransientDescriptors(const ServiceId &id) const; - ServiceLifeTime resolveLifeTime(const ServiceDescriptor &descriptor) const; - ServiceInstancesMap &getContainer(ServiceLifeTime lifetime); + ServiceLifeTime getLifeTime(const ServiceDescriptor &descriptor) const; + ServiceInstancesMap &getInstancesMap(ServiceLifeTime lifetime); - ServiceInstance tryCreate(const ServiceDescriptor &descriptor); - ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors); - void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); + ServiceInstance tryCreateInstance(const ServiceDescriptor &descriptor); + ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors); + void createRestInstances(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); - ServiceInstance tryCreateTransient(const ServiceDescriptor &descriptor); - ServiceInstanceList tryCreateAllTransient(const ServiceDescriptorList &descriptors); + ServiceInstance tryCreateTransientInstance(const ServiceDescriptor &descriptor); + ServiceInstanceList tryCreateTransientInstances(const ServiceDescriptorList &descriptors); ServiceInstancesCreator &selectCreator(const ServiceDescriptor &descriptor); ServiceAliasesCreator &getAliasesCreator() { return _aliasesCreator; } - ServiceInstancesCreator &getCreator() { return _instanceCreator; } + ServiceInstancesCreator &getCreator() { return _instancesCreator; } }; } // namespace sb::di::details From e32777e2ce0439a4907bfd51330a29d279dabfa5 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Tue, 23 Apr 2024 17:21:42 +0200 Subject: [PATCH 11/19] update include brackets + refactor alias code --- Docs/advanced-guides/using-aliases.rst | 6 +- Docs/reference/di/details/core.rst | 4 +- .../di/details/core/servicealiasescreator.rst | 6 ++ .../details/core/serviceinstancecreator.rst | 6 -- .../details/core/serviceinstancescreator.rst | 6 ++ .../details/core/serviceinstancesresolver.rst | 6 -- Include/SevenBit/DI.hpp | 6 +- .../Containers/Impl/ServiceDescriptorList.hpp | 28 +------ .../Containers/Impl/ServiceDescriptorsMap.hpp | 6 +- .../Containers/Impl/ServiceInstanceList.hpp | 44 ----------- .../Containers/Impl/ServiceInstancesMap.hpp | 4 +- .../Containers/ServiceDescriptorList.hpp | 34 ++------ .../Containers/ServiceDescriptorsMap.hpp | 13 ++-- .../Containers/ServiceInstanceList.hpp | 51 ++---------- .../Containers/ServiceInstancesMap.hpp | 11 +-- .../Core/IServiceInstanceProviderRoot.hpp | 8 +- .../Core/Impl/ServiceAliasesCreator.hpp | 10 +-- .../Core/Impl/ServiceInstanceProvider.hpp | 39 +++++----- .../Core/Impl/ServiceInstanceProviderRoot.hpp | 13 +--- .../Core/Impl/ServiceInstancesCreator.hpp | 14 ++-- .../DI/Details/Core/ServiceAliasesCreator.hpp | 14 ++-- .../Details/Core/ServiceInstanceProvider.hpp | 18 ++--- .../Core/ServiceInstanceProviderRoot.hpp | 14 ++-- .../Details/Core/ServiceInstancesCreator.hpp | 10 +-- .../Factories/ExternalServiceFactory.hpp | 6 +- .../DI/Details/Factories/ServiceFactory.hpp | 10 +-- .../Details/Factories/ServiceFcnFactory.hpp | 12 +-- .../Helpers/CircularDependencyGuard.hpp | 8 +- .../DI/Details/Helpers/CtorInjector.hpp | 8 +- .../DI/Details/Helpers/FunctorInjector.hpp | 4 +- .../Helpers/Impl/CircularDependencyGuard.hpp | 4 +- .../DI/Details/Helpers/Impl/ScopedGuard.hpp | 6 +- .../DI/Details/Helpers/ScopedGuard.hpp | 6 +- .../Helpers/ServiceCtorArgExtractor.hpp | 6 +- .../DI/Details/Helpers/ServiceGetter.hpp | 6 +- .../SevenBit/DI/Details/Models/ServiceId.hpp | 4 +- .../DI/Details/Services/AliasService.hpp | 6 +- .../DI/Details/Services/ExternalService.hpp | 6 +- .../DI/Details/Services/InPlaceService.hpp | 6 +- .../DI/Details/Services/UniquePtrService.hpp | 4 +- Include/SevenBit/DI/Details/Utils/Assert.hpp | 4 +- Include/SevenBit/DI/Details/Utils/Cast.hpp | 6 +- Include/SevenBit/DI/Details/Utils/Check.hpp | 2 +- .../SevenBit/DI/Details/Utils/Container.hpp | 2 +- .../DI/Details/Utils/CtorParamsNumber.hpp | 4 +- .../Details/Utils/Impl/RequireDescriptor.hpp | 4 +- .../DI/Details/Utils/Impl/RequireInstance.hpp | 6 +- Include/SevenBit/DI/Details/Utils/Meta.hpp | 2 +- Include/SevenBit/DI/Details/Utils/Require.hpp | 6 +- .../DI/Details/Utils/RequireDescriptor.hpp | 8 +- .../DI/Details/Utils/RequireInstance.hpp | 8 +- Include/SevenBit/DI/Exceptions.hpp | 6 +- Include/SevenBit/DI/Export.hpp | 4 +- Include/SevenBit/DI/IServiceFactory.hpp | 4 +- Include/SevenBit/DI/IServiceInstance.hpp | 4 +- .../SevenBit/DI/IServiceInstanceProvider.hpp | 8 +- Include/SevenBit/DI/Impl/Exceptions.hpp | 4 +- .../SevenBit/DI/Impl/ServiceCollection.hpp | 77 +----------------- Include/SevenBit/DI/LibraryConfig.hpp | 4 +- Include/SevenBit/DI/OneOrList.hpp | 11 +-- Include/SevenBit/DI/ServiceCollection.hpp | 78 +++++++++++-------- Include/SevenBit/DI/ServiceDescriber.hpp | 16 ++-- Include/SevenBit/DI/ServiceDescriptor.hpp | 8 +- Include/SevenBit/DI/ServiceInstance.hpp | 6 +- Include/SevenBit/DI/ServiceLifeTime.hpp | 4 +- Include/SevenBit/DI/ServiceLifeTimes.hpp | 4 +- Include/SevenBit/DI/ServiceProvider.hpp | 8 +- .../SevenBit/DI/ServiceProviderOptions.hpp | 2 +- Include/SevenBit/DI/TypeId.hpp | 2 +- Include/SevenBit/DI/Utils/GlobalServices.hpp | 4 +- Include/SevenBit/DI/Utils/Injected.hpp | 6 +- Include/SevenBit/DI/Utils/Register.hpp | 4 +- .../SevenBit/DI/Utils/ServiceExtractor.hpp | 6 +- SingleHeader/SevenBitDI.hpp.in | 2 +- Source/ConfigCheck.hpp | 4 +- Source/Source.cpp | 29 ++++--- Tests/Helpers/Classes/Complex.hpp | 4 +- Tests/Helpers/Classes/Dependencies.hpp | 2 +- Tests/Helpers/Classes/Legion.hpp | 2 +- .../Mocks/ServiceInstanceProviderMock.hpp | 2 +- Tests/Helpers/Mocks/ServiceProviderMock.hpp | 6 +- Tests/Integration/AliasTest.cpp | 2 +- Tests/Integration/BasicExternalTest.cpp | 4 +- Tests/Integration/BasicFactoryTest.cpp | 4 +- Tests/Integration/BasicTest.cpp | 4 +- Tests/Integration/BasicUniqFactoryTest.cpp | 4 +- Tests/Integration/InheritanceExternalTest.cpp | 4 +- Tests/Integration/InheritanceFactoryTest.cpp | 4 +- Tests/Integration/InheritanceTest.cpp | 4 +- .../InheritanceUniqFactoryTest.cpp | 4 +- Tests/Integration/InjectionTest.cpp | 2 +- Tests/Integration/Keyed/AliasKeyedTest.cpp | 2 +- .../Keyed/BasicExternalKeyedTest.cpp | 4 +- .../Keyed/BasicFactoryKeyedTest.cpp | 4 +- Tests/Integration/Keyed/BasicKeyedTest.cpp | 4 +- .../Keyed/BasicUniqFactoryKeyedTest.cpp | 4 +- .../Keyed/InheritanceExternalKeyedTest.cpp | 4 +- .../Keyed/InheritanceFactoryKeyedTest.cpp | 4 +- .../Keyed/InheritanceKeyedTest.cpp | 4 +- .../Keyed/InheritanceUniqFactoryKeyedTest.cpp | 4 +- .../MultiInheritanceExternalKeyedTest.cpp | 2 +- .../MultiInheritanceFactoryKeyedTest.cpp | 2 +- .../Keyed/MultiInheritanceKeyedTest.cpp | 2 +- .../MultiInheritanceUniqFactoryKeyedTest.cpp | 2 +- .../MultiInheritanceExternalTest.cpp | 2 +- .../MultiInheritanceFactoryTest.cpp | 2 +- Tests/Integration/MultiInheritanceTest.cpp | 2 +- .../MultiInheritanceUniqFactoryTest.cpp | 2 +- Tests/Integration/ScopeTest.cpp | 2 +- .../Containers/ServiceDescriptorListTest.cpp | 6 +- .../Containers/ServiceDescriptorsMapTest.cpp | 4 +- .../Containers/ServiceInstanceListTest.cpp | 28 ++----- .../Containers/ServiceInstancesMapTest.cpp | 6 +- .../Unit/Core/ServiceInstanceCreatorTest.cpp | 6 +- .../Core/ServiceInstanceProviderRootTest.cpp | 6 +- .../Unit/Core/ServiceInstanceResolverTest.cpp | 4 +- .../Factories/ExternalServiceFactoryTest.cpp | 2 +- Tests/Unit/Factories/ServiceFactoryTest.cpp | 2 +- .../Unit/Factories/ServiceFcnFactoryTest.cpp | 2 +- .../Helpers/CircularDependencyGuardTest.cpp | 4 +- Tests/Unit/Helpers/CtorInjectorTest.cpp | 4 +- Tests/Unit/Helpers/FunctorInjectorTest.cpp | 4 +- Tests/Unit/Helpers/ScopeGuardTest.cpp | 4 +- Tests/Unit/Helpers/ServiceGetterTest.cpp | 6 +- Tests/Unit/OneOrListTest.cpp | 49 +++++++++++- Tests/Unit/ServiceCollectionTest.cpp | 4 +- Tests/Unit/ServiceDescriberTest.cpp | 6 +- Tests/Unit/ServiceDescriptorTest.cpp | 4 +- Tests/Unit/ServiceInstanceTest.cpp | 6 +- Tests/Unit/ServiceLifeTimeTest.cpp | 2 +- Tests/Unit/ServiceProviderTest.cpp | 4 +- Tests/Unit/Services/AliasServiceTest.cpp | 4 +- Tests/Unit/Services/ExternalServiceTest.cpp | 4 +- Tests/Unit/Services/InPlaceServiceTest.cpp | 4 +- Tests/Unit/Services/UniquePtrServiceTest.cpp | 4 +- Tests/Unit/Utils/CastTest.cpp | 4 +- Tests/Unit/Utils/CheckTest.cpp | 2 +- Tests/Unit/Utils/CtorParamsNumberTest.cpp | 2 +- Tests/Unit/Utils/MetaTest.cpp | 2 +- Tests/Unit/Utils/RequireDescriptorTest.cpp | 6 +- Tests/Unit/Utils/RequireInstanceTest.cpp | 12 +-- Tests/Unit/Utils/RequireTest.cpp | 4 +- 142 files changed, 492 insertions(+), 653 deletions(-) create mode 100644 Docs/reference/di/details/core/servicealiasescreator.rst delete mode 100644 Docs/reference/di/details/core/serviceinstancecreator.rst create mode 100644 Docs/reference/di/details/core/serviceinstancescreator.rst delete mode 100644 Docs/reference/di/details/core/serviceinstancesresolver.rst delete mode 100644 Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp diff --git a/Docs/advanced-guides/using-aliases.rst b/Docs/advanced-guides/using-aliases.rst index fe2f284..5d82c33 100644 --- a/Docs/advanced-guides/using-aliases.rst +++ b/Docs/advanced-guides/using-aliases.rst @@ -2,8 +2,12 @@ Using Aliases ======================================== With the use of aliases, one service can be injected through its multiple base classes, also aliases can be chained. -If multiple aliases are registered with the same base class only last will be used. +In case of injecting multiple aliases all real services will be fetched. +.. warning:: + Using aliases is resource intensive, especially for injecting transient and multiple services, provider recursively + traverses through aliases chain to find proper service. Mixing scoped and singleton aliases for same base type will + lead to undefined behavior .. literalinclude:: ../../Examples/Guides/ServiceAliases.cpp :caption: Examples/Guides/ServiceAliases diff --git a/Docs/reference/di/details/core.rst b/Docs/reference/di/details/core.rst index d779969..04b3d47 100644 --- a/Docs/reference/di/details/core.rst +++ b/Docs/reference/di/details/core.rst @@ -6,7 +6,7 @@ sb::di::details - Core :titlesonly: core/iserviceinstanceproviderroot.rst - core/serviceinstancecreator.rst + core/servicealiasescreator.rst core/serviceinstanceprovider.rst core/serviceinstanceproviderroot.rst - core/serviceinstancesresolver.rst + core/serviceinstancescreator.rst diff --git a/Docs/reference/di/details/core/servicealiasescreator.rst b/Docs/reference/di/details/core/servicealiasescreator.rst new file mode 100644 index 0000000..cca4437 --- /dev/null +++ b/Docs/reference/di/details/core/servicealiasescreator.rst @@ -0,0 +1,6 @@ +ServiceAliasesCreator +======================================== + +.. doxygenclass:: sb::di::details::ServiceAliasesCreator + :members: + :undoc-members: diff --git a/Docs/reference/di/details/core/serviceinstancecreator.rst b/Docs/reference/di/details/core/serviceinstancecreator.rst deleted file mode 100644 index cac9a41..0000000 --- a/Docs/reference/di/details/core/serviceinstancecreator.rst +++ /dev/null @@ -1,6 +0,0 @@ -ServiceInstanceCreator -======================================== - -.. doxygenclass:: sb::di::details::ServiceInstanceCreator - :members: - :undoc-members: diff --git a/Docs/reference/di/details/core/serviceinstancescreator.rst b/Docs/reference/di/details/core/serviceinstancescreator.rst new file mode 100644 index 0000000..07d6756 --- /dev/null +++ b/Docs/reference/di/details/core/serviceinstancescreator.rst @@ -0,0 +1,6 @@ +ServiceInstancesCreator +======================================== + +.. doxygenclass:: sb::di::details::ServiceInstancesCreator + :members: + :undoc-members: diff --git a/Docs/reference/di/details/core/serviceinstancesresolver.rst b/Docs/reference/di/details/core/serviceinstancesresolver.rst deleted file mode 100644 index 24225f7..0000000 --- a/Docs/reference/di/details/core/serviceinstancesresolver.rst +++ /dev/null @@ -1,6 +0,0 @@ -ServiceInstancesResolver -======================================== - -.. doxygenclass:: sb::di::details::ServiceInstancesResolver - :members: - :undoc-members: diff --git a/Include/SevenBit/DI.hpp b/Include/SevenBit/DI.hpp index 15c424d..f548dcf 100644 --- a/Include/SevenBit/DI.hpp +++ b/Include/SevenBit/DI.hpp @@ -1,6 +1,6 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/ServiceCollection.hpp" -#include "SevenBit/DI/Utils/Injected.hpp" +#include +#include diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp index 92a4f84..51c5255 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp @@ -1,18 +1,12 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include namespace sb::di::details { - - INLINE ServiceDescriptorList::ServiceDescriptorList(ServiceDescriptor &&descriptor) - : _oneOrList(std::move(descriptor)) - { - } - INLINE void ServiceDescriptorList::add(ServiceDescriptor &&descriptor) { if (!empty()) @@ -22,20 +16,9 @@ namespace sb::di::details checkAlias(descriptor); checkLifeTime(descriptor); } - _oneOrList.add(std::move(descriptor)); + OneOrList::add(std::move(descriptor)); } - INLINE OneOrList &ServiceDescriptorList::getInnerList() { return _oneOrList; } - INLINE const OneOrList &ServiceDescriptorList::getInnerList() const { return _oneOrList; } - - INLINE const ServiceDescriptor &ServiceDescriptorList::first() const { return _oneOrList.first(); } - - INLINE const ServiceDescriptor &ServiceDescriptorList::last() const { return _oneOrList.last(); } - - INLINE bool ServiceDescriptorList::empty() const { return _oneOrList.empty(); } - - INLINE std::size_t ServiceDescriptorList::size() const { return _oneOrList.size(); } - INLINE ServiceLifeTime ServiceDescriptorList::getLifeTime() const { return first().getLifeTime(); } INLINE TypeId ServiceDescriptorList::getServiceTypeId() const { return first().getServiceTypeId(); } @@ -76,7 +59,4 @@ namespace sb::di::details throw ServiceLifeTimeMismatchException{descriptor.getImplementationTypeId(), getServiceTypeId()}; } } - - INLINE void ServiceDescriptorList::seal() { _oneOrList.shrink(); } - } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp index 2ad5b5b..35556e2 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp @@ -1,9 +1,9 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp deleted file mode 100644 index 249ef7f..0000000 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include "SevenBit/DI/LibraryConfig.hpp" - -#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" -#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" - -namespace sb::di::details -{ - INLINE ServiceInstanceList::ServiceInstanceList(const std::size_t size) : _oneOrList(size) {} - - INLINE ServiceInstanceList::ServiceInstanceList(ServiceInstance instance) : _oneOrList(std::move(instance)) {} - - INLINE void ServiceInstanceList::add(ServiceInstance &&instance) { _oneOrList.add(std::move(instance)); } - - INLINE void ServiceInstanceList::add(ServiceInstanceList &&instances) { add(std::move(instances.getInnerList())); } - - INLINE void ServiceInstanceList::add(OneOrList &&instances) - { - _oneOrList.add(std::move(instances)); - } - - INLINE OneOrList &ServiceInstanceList::getInnerList() { return _oneOrList; } - INLINE const OneOrList &ServiceInstanceList::getInnerList() const { return _oneOrList; } - - INLINE ServiceInstance &ServiceInstanceList::first() { return _oneOrList.first(); } - INLINE const ServiceInstance &ServiceInstanceList::first() const { return _oneOrList.first(); } - - INLINE ServiceInstance &ServiceInstanceList::last() { return _oneOrList.last(); } - INLINE const ServiceInstance &ServiceInstanceList::last() const { return _oneOrList.last(); } - - INLINE std::size_t ServiceInstanceList::size() const { return _oneOrList.size(); } - - INLINE bool ServiceInstanceList::empty() const { return _oneOrList.empty(); } - - INLINE void ServiceInstanceList::reserve(const std::size_t newCapacity) { return _oneOrList.reserve(newCapacity); } - - INLINE void ServiceInstanceList::shrink() { return _oneOrList.shrink(); } - - INLINE void ServiceInstanceList::seal() { _sealed = true; } - - INLINE void ServiceInstanceList::clear() { _oneOrList.clear(); } - -} // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp index df48a37..cc780c3 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp index 0d86029..5fb3f1d 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp @@ -1,20 +1,18 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/OneOrList.hpp" -#include "SevenBit/DI/ServiceDescriptor.hpp" -#include "SevenBit/DI/ServiceLifeTime.hpp" -#include "SevenBit/DI/TypeId.hpp" +#include +#include +#include +#include namespace sb::di::details { - class EXPORT ServiceDescriptorList + class EXPORT ServiceDescriptorList : public OneOrList { - OneOrList _oneOrList; - public: - explicit ServiceDescriptorList(ServiceDescriptor &&descriptor); + using OneOrList::OneOrList; ServiceDescriptorList(const ServiceDescriptorList &) = delete; ServiceDescriptorList(ServiceDescriptorList &&) = default; @@ -22,22 +20,8 @@ namespace sb::di::details ServiceDescriptorList &operator=(const ServiceDescriptorList &) = delete; ServiceDescriptorList &operator=(ServiceDescriptorList &&) = default; - OneOrList &getInnerList(); - [[nodiscard]] const OneOrList &getInnerList() const; - void add(ServiceDescriptor &&descriptor); - [[nodiscard]] auto begin() const { return _oneOrList.getAsList().begin(); } - [[nodiscard]] auto end() const { return _oneOrList.getAsList().end(); } - - [[nodiscard]] const ServiceDescriptor &first() const; - - [[nodiscard]] const ServiceDescriptor &last() const; - - [[nodiscard]] bool empty() const; - - [[nodiscard]] std::size_t size() const; - [[nodiscard]] ServiceLifeTime getLifeTime() const; [[nodiscard]] TypeId getServiceTypeId() const; @@ -46,8 +30,6 @@ namespace sb::di::details [[nodiscard]] bool isAlias() const; - void seal(); - private: void checkBaseType(const ServiceDescriptor &descriptor) const; void checkKey(const ServiceDescriptor &descriptor) const; @@ -58,5 +40,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp b/Include/SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp index 23711fa..66136f4 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp @@ -4,11 +4,11 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Details/Models/ServiceId.hpp" -#include "SevenBit/DI/ServiceDescriptor.hpp" +#include +#include +#include namespace sb::di::details { @@ -36,9 +36,10 @@ namespace sb::di::details } ServiceDescriptorsMap(const ServiceDescriptorsMap &) = delete; - ServiceDescriptorsMap(ServiceDescriptorsMap &&) noexcept = default; + ServiceDescriptorsMap(ServiceDescriptorsMap &&) = default; ServiceDescriptorsMap &operator=(const ServiceDescriptorsMap &) = delete; + ServiceDescriptorsMap &operator=(ServiceDescriptorsMap &&) = delete; void add(ServiceDescriptor descriptor); @@ -53,5 +54,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp index f7a1cc3..b1dd1f4 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp @@ -1,22 +1,18 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/OneOrList.hpp" -#include "SevenBit/DI/ServiceInstance.hpp" +#include +#include namespace sb::di::details { - class EXPORT ServiceInstanceList + class ServiceInstanceList : public OneOrList { - OneOrList _oneOrList; bool _sealed = false; public: - ServiceInstanceList() = default; - explicit ServiceInstanceList(ServiceInstance instance); - explicit ServiceInstanceList(std::size_t size); - explicit ServiceInstanceList(OneOrList &&other) : _oneOrList(std::move(other)) {} + using OneOrList::OneOrList; ServiceInstanceList(const ServiceInstanceList &) = delete; ServiceInstanceList(ServiceInstanceList &&) = default; @@ -24,42 +20,7 @@ namespace sb::di::details ServiceInstanceList &operator=(const ServiceInstanceList &) = delete; ServiceInstanceList &operator=(ServiceInstanceList &&) = default; - explicit operator bool() const { return !_oneOrList.isUninitialized(); } - - void add(ServiceInstance &&instance); - void add(ServiceInstanceList &&instances); - void add(OneOrList &&instances); - - [[nodiscard]] auto begin() const { return _oneOrList.getAsList().begin(); } - [[nodiscard]] auto end() const { return _oneOrList.getAsList().end(); } - - OneOrList &getInnerList(); - [[nodiscard]] const OneOrList &getInnerList() const; - - ServiceInstance &first(); - [[nodiscard]] const ServiceInstance &first() const; - - ServiceInstance &last(); - [[nodiscard]] const ServiceInstance &last() const; - - [[nodiscard]] std::size_t size() const; - - [[nodiscard]] bool empty() const; - - void reserve(std::size_t newCapacity); - - void shrink(); - - void seal(); - + void seal() { _sealed = true; } [[nodiscard]] bool isSealed() const { return _sealed; } - - void clear(); - - ~ServiceInstanceList() = default; }; } // namespace sb::di::details - -#ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp" -#endif diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp index 1a34ea1..40e5070 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp @@ -4,10 +4,10 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" -#include "SevenBit/DI/Details/Models/ServiceId.hpp" +#include +#include namespace sb::di::details { @@ -23,9 +23,10 @@ namespace sb::di::details explicit ServiceInstancesMap(bool strongDestructionOrder = false); ServiceInstancesMap(const ServiceInstancesMap &) = delete; - ServiceInstancesMap(ServiceInstancesMap &&) noexcept = default; + ServiceInstancesMap(ServiceInstancesMap &&) = default; ServiceInstancesMap &operator=(const ServiceInstancesMap &) = delete; + ServiceInstancesMap &operator=(ServiceInstancesMap &&) = delete; ServiceInstanceList &insert(const ServiceId &id, ServiceInstance &&instance); @@ -45,5 +46,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp index 2005116..999f15b 100644 --- a/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp @@ -1,10 +1,10 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp" -#include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" +#include +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp index 2eee6f5..0e0fac6 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp @@ -3,12 +3,12 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp" -#include "SevenBit/DI/Details/Services/AliasService.hpp" -#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" -#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" +#include +#include +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index 25e9b24..225e9b0 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -1,14 +1,14 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp" -#include "SevenBit/DI/Details/Services/ExternalService.hpp" -#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceInstance.hpp" -#include "SevenBit/DI/ServiceLifeTimes.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" +#include +#include +#include +#include +#include +#include +#include namespace sb::di::details { @@ -49,10 +49,10 @@ namespace sb::di::details if (const auto descriptors = findDescriptors(id)) { const auto &descriptor = descriptors->last(); - if (auto instance = tryCreateInstance(descriptor)) + if (auto created = tryCreateInstance(descriptor)) { - auto &inserted = getInstancesMap(getLifeTime(descriptor)).insert(id, std::move(instance)); - if (!descriptors->isAlias() && descriptors->size() == 1) + auto &inserted = getInstancesMap(getLifeTime(descriptor)).insert(id, std::move(created)); + if (!descriptor.isAlias() && descriptors->size() == 1) { inserted.seal(); } @@ -74,15 +74,15 @@ namespace sb::di::details instances->seal(); } } - return &instances->getInnerList(); + return instances; } if (const auto descriptors = findDescriptors(id)) { - if (auto instances = tryCreateInstances(*descriptors)) + if (auto created = tryCreateInstances(*descriptors)) { - auto &inserted = getInstancesMap(getLifeTime(descriptors->last())).insert(id, std::move(instances)); + auto &inserted = getInstancesMap(getLifeTime(descriptors->last())).insert(id, std::move(created)); inserted.seal(); - return &inserted.getInnerList(); + return &inserted; } } return nullptr; @@ -107,8 +107,7 @@ namespace sb::di::details INLINE OneOrList ServiceInstanceProvider::tryCreateInstances(const ServiceId &id) { const auto descriptors = findTransientDescriptors(id); - return descriptors ? std::move(tryCreateTransientInstances(*descriptors).getInnerList()) - : OneOrList{}; + return descriptors ? tryCreateTransientInstances(*descriptors) : OneOrList{}; } INLINE ServiceInstance ServiceInstanceProvider::createInstanceInPlace(const ServiceId &id) @@ -189,7 +188,7 @@ namespace sb::di::details const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { - return getAliasesCreator().tryCreateAll(descriptors, [&](const ServiceDescriptor &original) { + return getAliasesCreator().tryCreateAll(descriptors, [this](const ServiceDescriptor &original) { return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()}); }); } @@ -203,7 +202,7 @@ namespace sb::di::details const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { - return getAliasesCreator().tryCreateRest(descriptors, instances, [&](const ServiceDescriptor &original) { + return getAliasesCreator().tryCreateRest(descriptors, instances, [this](const ServiceDescriptor &original) { return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()}); }); } @@ -228,7 +227,7 @@ namespace sb::di::details const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { - return getAliasesCreator().tryMapAll(descriptors, [&](const ServiceDescriptor &original) { + return getAliasesCreator().tryMapAll(descriptors, [this](const ServiceDescriptor &original) { return tryCreateInstances({original.getImplementationTypeId(), original.getImplementationKey()}); }); } diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp index d54d5d1..7762f19 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp" +#include namespace sb::di::details { @@ -22,15 +22,6 @@ namespace sb::di::details } } - INLINE const ServiceDescriptorsMap &ServiceInstanceProviderRoot::getDescriptorsMap() const - { - return _descriptorsMap; - } - - INLINE ServiceInstancesMap &ServiceInstanceProviderRoot::getSingletons() { return _singletons; } - - INLINE ServiceInstancesCreator &ServiceInstanceProviderRoot::getRootCreator() { return getCreator(); } - INLINE void ServiceInstanceProviderRoot::prebuildSingletons() { for (auto &[id, descriptors] : getDescriptorsMap()) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp index 04aca5e..45f8e11 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp @@ -3,12 +3,12 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" -#include "SevenBit/DI/Details/Utils/Require.hpp" -#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" -#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" +#include +#include +#include +#include namespace sb::di::details { @@ -49,7 +49,7 @@ namespace sb::di::details { ServiceInstanceList instances; instances.reserve(descriptors.size()); - descriptors.getInnerList().forEach( + descriptors.forEach( [&](const ServiceDescriptor &descriptor) { instances.add(create(descriptor, inPlaceRequest)); }); return instances; } @@ -61,7 +61,7 @@ namespace sb::di::details { instances.reserve(size); auto first = create(descriptors.first(), inPlaceRequest); - descriptors.getInnerList().forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) { + descriptors.forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) { if (index && index < size - 1) // skip first and last { instances.add(create(descriptor, inPlaceRequest)); diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp index bdd467c..5233f34 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp @@ -1,9 +1,9 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" +#include +#include namespace sb::di::details { @@ -17,7 +17,7 @@ namespace sb::di::details ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const { ServiceInstanceList instances; - descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { + descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor) { tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)); }); return instances; @@ -30,7 +30,7 @@ namespace sb::di::details auto first = std::move(instances.first()); instances.clear(); const auto size = descriptors.size(); - descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { + descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { index < size - 1 ? tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)) : tryCreateRest(instances, aliasDescriptor, originalResolver(aliasDescriptor), std::move(first)); @@ -43,7 +43,7 @@ namespace sb::di::details ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const { ServiceInstanceList instances; - descriptors.getInnerList().forEach([&](const ServiceDescriptor &aliasDescriptor) { + descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor) { tryMapAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)); }); return instances; @@ -65,5 +65,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index 5526ae9..f50177a 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -3,15 +3,15 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" -#include "SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp" -#include "SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" -#include "SevenBit/DI/IServiceInstanceProvider.hpp" -#include "SevenBit/DI/ServiceProviderOptions.hpp" +#include +#include +#include +#include +#include +#include +#include namespace sb::di::details { @@ -150,5 +150,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp index 4545879..917961e 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp" +#include +#include namespace sb::di::details { @@ -31,11 +31,11 @@ namespace sb::di::details void init(ServiceProvider &serviceProvider) override; - [[nodiscard]] const ServiceDescriptorsMap &getDescriptorsMap() const override; + [[nodiscard]] const ServiceDescriptorsMap &getDescriptorsMap() const override { return _descriptorsMap; } - ServiceInstancesMap &getSingletons() override; + ServiceInstancesMap &getSingletons() override { return _singletons; } - ServiceInstancesCreator &getRootCreator() override; + ServiceInstancesCreator &getRootCreator() override { return getCreator(); } private: void prebuildSingletons(); @@ -43,5 +43,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp index df09c57..e6fc01d 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp @@ -1,10 +1,10 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" -#include "SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp" +#include +#include +#include namespace sb::di::details { @@ -32,5 +32,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp b/Include/SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp index 541fe67..86997f5 100644 --- a/Include/SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp +++ b/Include/SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Services/ExternalService.hpp" -#include "SevenBit/DI/IServiceFactory.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp b/Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp index a31f88b..c1069c0 100644 --- a/Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp +++ b/Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp @@ -3,12 +3,12 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/CtorInjector.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" -#include "SevenBit/DI/Details/Services/UniquePtrService.hpp" -#include "SevenBit/DI/IServiceFactory.hpp" +#include +#include +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp b/Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp index 68ee336..aa8eff7 100644 --- a/Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp +++ b/Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp @@ -3,13 +3,13 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/FunctorInjector.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" -#include "SevenBit/DI/Details/Services/UniquePtrService.hpp" -#include "SevenBit/DI/Details/Utils/Meta.hpp" -#include "SevenBit/DI/IServiceFactory.hpp" +#include +#include +#include +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp b/Include/SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp index 55a9da0..bd91122 100644 --- a/Include/SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp +++ b/Include/SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/ScopedGuard.hpp" -#include "SevenBit/DI/TypeId.hpp" +#include +#include namespace sb::di::details { @@ -21,5 +21,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp b/Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp index 20148b9..976d3d1 100644 --- a/Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp +++ b/Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp @@ -2,11 +2,11 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp" -#include "SevenBit/DI/Details/Utils/CtorParamsNumber.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" +#include +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp b/Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp index fdb2b8d..c1388b1 100644 --- a/Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp +++ b/Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/ServiceGetter.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp b/Include/SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp index 769e226..f41c073 100644 --- a/Include/SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp +++ b/Include/SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp b/Include/SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp index 77a0603..ad95df2 100644 --- a/Include/SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp +++ b/Include/SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/ScopedGuard.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/ScopedGuard.hpp b/Include/SevenBit/DI/Details/Helpers/ScopedGuard.hpp index 190147a..7c2d760 100644 --- a/Include/SevenBit/DI/Details/Helpers/ScopedGuard.hpp +++ b/Include/SevenBit/DI/Details/Helpers/ScopedGuard.hpp @@ -2,9 +2,9 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/TypeId.hpp" +#include namespace sb::di::details { @@ -22,5 +22,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp b/Include/SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp index fa93d27..52091b0 100644 --- a/Include/SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp +++ b/Include/SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp @@ -1,9 +1,9 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/ServiceGetter.hpp" -#include "SevenBit/DI/Details/Utils/Meta.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/ServiceGetter.hpp b/Include/SevenBit/DI/Details/Helpers/ServiceGetter.hpp index dc4477b..7c0a951 100644 --- a/Include/SevenBit/DI/Details/Helpers/ServiceGetter.hpp +++ b/Include/SevenBit/DI/Details/Helpers/ServiceGetter.hpp @@ -3,10 +3,10 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Meta.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Models/ServiceId.hpp b/Include/SevenBit/DI/Details/Models/ServiceId.hpp index 1b7dc2a..2153db4 100644 --- a/Include/SevenBit/DI/Details/Models/ServiceId.hpp +++ b/Include/SevenBit/DI/Details/Models/ServiceId.hpp @@ -5,9 +5,9 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/TypeId.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Services/AliasService.hpp b/Include/SevenBit/DI/Details/Services/AliasService.hpp index 54a21ea..ce80192 100644 --- a/Include/SevenBit/DI/Details/Services/AliasService.hpp +++ b/Include/SevenBit/DI/Details/Services/AliasService.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/IServiceInstance.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Services/ExternalService.hpp b/Include/SevenBit/DI/Details/Services/ExternalService.hpp index 6edcc6a..6472007 100644 --- a/Include/SevenBit/DI/Details/Services/ExternalService.hpp +++ b/Include/SevenBit/DI/Details/Services/ExternalService.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/IServiceInstance.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Services/InPlaceService.hpp b/Include/SevenBit/DI/Details/Services/InPlaceService.hpp index 6ba7d7c..6060262 100644 --- a/Include/SevenBit/DI/Details/Services/InPlaceService.hpp +++ b/Include/SevenBit/DI/Details/Services/InPlaceService.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/IServiceInstance.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Services/UniquePtrService.hpp b/Include/SevenBit/DI/Details/Services/UniquePtrService.hpp index f5044a0..a516347 100644 --- a/Include/SevenBit/DI/Details/Services/UniquePtrService.hpp +++ b/Include/SevenBit/DI/Details/Services/UniquePtrService.hpp @@ -2,9 +2,9 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/IServiceInstance.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Assert.hpp b/Include/SevenBit/DI/Details/Utils/Assert.hpp index d4d2900..52f1fcb 100644 --- a/Include/SevenBit/DI/Details/Utils/Assert.hpp +++ b/Include/SevenBit/DI/Details/Utils/Assert.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Meta.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Cast.hpp b/Include/SevenBit/DI/Details/Utils/Cast.hpp index 43108af..1334e10 100644 --- a/Include/SevenBit/DI/Details/Utils/Cast.hpp +++ b/Include/SevenBit/DI/Details/Utils/Cast.hpp @@ -2,20 +2,20 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include namespace sb::di::details { struct Cast { - template static constexpr intptr_t getCastOffset() + template static constexpr ptrdiff_t getCastOffset() { auto implementation = reinterpret_cast(std::numeric_limits::max() / 2); auto service = static_cast(implementation); return reinterpret_cast(service) - reinterpret_cast(implementation); }; - static void *applyCastOffset(void *ptr, const intptr_t offset) + static void *applyCastOffset(void *ptr, const ptrdiff_t offset) { const auto casted = reinterpret_cast(ptr) + offset; return reinterpret_cast(casted); diff --git a/Include/SevenBit/DI/Details/Utils/Check.hpp b/Include/SevenBit/DI/Details/Utils/Check.hpp index b3eefda..a14c078 100644 --- a/Include/SevenBit/DI/Details/Utils/Check.hpp +++ b/Include/SevenBit/DI/Details/Utils/Check.hpp @@ -1,6 +1,6 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Container.hpp b/Include/SevenBit/DI/Details/Utils/Container.hpp index 2b2ce55..486d2fd 100644 --- a/Include/SevenBit/DI/Details/Utils/Container.hpp +++ b/Include/SevenBit/DI/Details/Utils/Container.hpp @@ -2,7 +2,7 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/CtorParamsNumber.hpp b/Include/SevenBit/DI/Details/Utils/CtorParamsNumber.hpp index e07eeb5..60744e3 100644 --- a/Include/SevenBit/DI/Details/Utils/CtorParamsNumber.hpp +++ b/Include/SevenBit/DI/Details/Utils/CtorParamsNumber.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Meta.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp b/Include/SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp index 19cdde3..cac84ad 100644 --- a/Include/SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp +++ b/Include/SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp b/Include/SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp index 9ec171a..11bb303 100644 --- a/Include/SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp +++ b/Include/SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp @@ -1,9 +1,9 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" -#include "SevenBit/DI/Details/Utils/Require.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Meta.hpp b/Include/SevenBit/DI/Details/Utils/Meta.hpp index ed81d5a..e002656 100644 --- a/Include/SevenBit/DI/Details/Utils/Meta.hpp +++ b/Include/SevenBit/DI/Details/Utils/Meta.hpp @@ -3,7 +3,7 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Require.hpp b/Include/SevenBit/DI/Details/Utils/Require.hpp index 1c3a529..7a2bc27 100644 --- a/Include/SevenBit/DI/Details/Utils/Require.hpp +++ b/Include/SevenBit/DI/Details/Utils/Require.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Check.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/RequireDescriptor.hpp b/Include/SevenBit/DI/Details/Utils/RequireDescriptor.hpp index 8ffdb90..f668828 100644 --- a/Include/SevenBit/DI/Details/Utils/RequireDescriptor.hpp +++ b/Include/SevenBit/DI/Details/Utils/RequireDescriptor.hpp @@ -1,9 +1,9 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/ServiceDescriptor.hpp" -#include "SevenBit/DI/ServiceInstance.hpp" +#include +#include namespace sb::di::details { @@ -18,5 +18,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Details/Utils/RequireInstance.hpp b/Include/SevenBit/DI/Details/Utils/RequireInstance.hpp index a44aa54..9ceb12b 100644 --- a/Include/SevenBit/DI/Details/Utils/RequireInstance.hpp +++ b/Include/SevenBit/DI/Details/Utils/RequireInstance.hpp @@ -1,9 +1,9 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/ServiceDescriptor.hpp" -#include "SevenBit/DI/ServiceInstance.hpp" +#include +#include namespace sb::di::details { @@ -18,5 +18,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Exceptions.hpp b/Include/SevenBit/DI/Exceptions.hpp index 4d398ff..7d0a77b 100644 --- a/Include/SevenBit/DI/Exceptions.hpp +++ b/Include/SevenBit/DI/Exceptions.hpp @@ -3,9 +3,9 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/TypeId.hpp" +#include namespace sb::di { @@ -65,5 +65,5 @@ namespace sb::di } // namespace sb::di #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Impl/Exceptions.hpp" +#include #endif diff --git a/Include/SevenBit/DI/Export.hpp b/Include/SevenBit/DI/Export.hpp index 37c00c8..b3384f4 100644 --- a/Include/SevenBit/DI/Export.hpp +++ b/Include/SevenBit/DI/Export.hpp @@ -1,6 +1,6 @@ #pragma once -#include "SevenBit/DI/CmakeDef.hpp" +#include #ifdef _7BIT_DI_SHARED_LIB //!!! cmake when compiling shared lib sets _EXPORTS @@ -32,4 +32,4 @@ #else // Static or header only lib #define EXPORT -#endif \ No newline at end of file +#endif diff --git a/Include/SevenBit/DI/IServiceFactory.hpp b/Include/SevenBit/DI/IServiceFactory.hpp index 9d12263..9c48f08 100644 --- a/Include/SevenBit/DI/IServiceFactory.hpp +++ b/Include/SevenBit/DI/IServiceFactory.hpp @@ -2,9 +2,9 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/IServiceInstance.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/IServiceInstance.hpp b/Include/SevenBit/DI/IServiceInstance.hpp index eb70e84..5a61a0f 100644 --- a/Include/SevenBit/DI/IServiceInstance.hpp +++ b/Include/SevenBit/DI/IServiceInstance.hpp @@ -2,9 +2,9 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/TypeId.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/IServiceInstanceProvider.hpp b/Include/SevenBit/DI/IServiceInstanceProvider.hpp index d9d5015..deef611 100644 --- a/Include/SevenBit/DI/IServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/IServiceInstanceProvider.hpp @@ -4,11 +4,11 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/OneOrList.hpp" -#include "SevenBit/DI/ServiceInstance.hpp" -#include "SevenBit/DI/TypeId.hpp" +#include +#include +#include namespace sb::di { diff --git a/Include/SevenBit/DI/Impl/Exceptions.hpp b/Include/SevenBit/DI/Impl/Exceptions.hpp index 0fbe748..5991fc1 100644 --- a/Include/SevenBit/DI/Impl/Exceptions.hpp +++ b/Include/SevenBit/DI/Impl/Exceptions.hpp @@ -2,9 +2,9 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Exceptions.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/Impl/ServiceCollection.hpp b/Include/SevenBit/DI/Impl/ServiceCollection.hpp index 3254c43..125ccd3 100644 --- a/Include/SevenBit/DI/Impl/ServiceCollection.hpp +++ b/Include/SevenBit/DI/Impl/ServiceCollection.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include namespace sb::di { @@ -20,42 +20,6 @@ namespace sb::di return std::make_unique(std::move(instanceProvider)); } - INLINE std::vector &ServiceCollection::getInnerVector() { return _serviceDescriptors; } - INLINE const std::vector &ServiceCollection::getInnerVector() const - { - return _serviceDescriptors; - } - - INLINE ServiceDescriptor &ServiceCollection::at(const std::size_t index) { return _serviceDescriptors.at(index); } - INLINE const ServiceDescriptor &ServiceCollection::at(const std::size_t index) const - { - return _serviceDescriptors.at(index); - } - - INLINE ServiceDescriptor &ServiceCollection::first() { return at(0); } - INLINE const ServiceDescriptor &ServiceCollection::first() const { return at(0); } - - INLINE ServiceDescriptor &ServiceCollection::last() { return at(size() - 1); } - INLINE const ServiceDescriptor &ServiceCollection::last() const { return at(size() - 1); } - - INLINE ServiceDescriptor &ServiceCollection::operator[](const std::size_t index) { return at(index); } - INLINE const ServiceDescriptor &ServiceCollection::operator[](const std::size_t index) const { return at(index); } - - INLINE std::size_t ServiceCollection::maxSize() const { return _serviceDescriptors.max_size(); } - - INLINE std::size_t ServiceCollection::size() const { return _serviceDescriptors.size(); } - INLINE std::size_t ServiceCollection::count() const { return size(); } - - INLINE bool ServiceCollection::empty() const { return _serviceDescriptors.empty(); } - - INLINE std::size_t ServiceCollection::capacity() const { return _serviceDescriptors.capacity(); } - - INLINE void ServiceCollection::reserve(const std::size_t space) { _serviceDescriptors.reserve(space); } - - INLINE void ServiceCollection::shrinkToFit() { _serviceDescriptors.shrink_to_fit(); } - - INLINE void ServiceCollection::clear() { _serviceDescriptors.clear(); } - INLINE bool ServiceCollection::contains(const TypeId serviceTypeId) const { return containsIf( @@ -88,11 +52,6 @@ namespace sb::di }); } - INLINE ServiceCollection::Iterator ServiceCollection::insert(const ConstIterator pos, ServiceDescriptor descriptor) - { - return _serviceDescriptors.insert(pos, std::move(descriptor)); - } - INLINE ServiceCollection &ServiceCollection::add(ServiceDescriptor descriptor) { _serviceDescriptors.push_back(std::move(descriptor)); @@ -109,25 +68,6 @@ namespace sb::di return *this; } - INLINE ServiceCollection::Iterator ServiceCollection::remove(const Iterator pos) - { - return _serviceDescriptors.erase(pos); - } - INLINE ServiceCollection::Iterator ServiceCollection::remove(const ConstIterator pos) - { - return _serviceDescriptors.erase(pos); - } - - INLINE ServiceCollection::Iterator ServiceCollection::removeRange(const Iterator begin, const Iterator end) - { - return _serviceDescriptors.erase(begin, end); - } - INLINE ServiceCollection::Iterator ServiceCollection::removeRange(const ConstIterator begin, - const ConstIterator end) - { - return _serviceDescriptors.erase(begin, end); - } - INLINE std::size_t ServiceCollection::removeAll(const TypeId serviceTypeId) { return removeIf( @@ -159,15 +99,4 @@ namespace sb::di *descriptor.getServiceKey() == serviceKey; }); } - - INLINE void ServiceCollection::pop() { _serviceDescriptors.pop_back(); } - - INLINE bool operator==(const ServiceCollection &lhs, const ServiceCollection &rhs) - { - return lhs._serviceDescriptors == rhs._serviceDescriptors; - } - INLINE bool operator!=(const ServiceCollection &lhs, const ServiceCollection &rhs) - { - return lhs._serviceDescriptors != rhs._serviceDescriptors; - } } // namespace sb::di diff --git a/Include/SevenBit/DI/LibraryConfig.hpp b/Include/SevenBit/DI/LibraryConfig.hpp index ef35679..075a35c 100644 --- a/Include/SevenBit/DI/LibraryConfig.hpp +++ b/Include/SevenBit/DI/LibraryConfig.hpp @@ -1,6 +1,6 @@ #pragma once -#include "SevenBit/DI/CmakeDef.hpp" +#include #ifndef _7BIT_DI_VERSION_MAJOR #define _7BIT_DI_VERSION_MAJOR 0 @@ -56,4 +56,4 @@ #define _7BIT_DI_CTOR_PARAMS_LIMIT 100 #endif -#include "SevenBit/DI/Export.hpp" +#include diff --git a/Include/SevenBit/DI/OneOrList.hpp b/Include/SevenBit/DI/OneOrList.hpp index 995d59c..42f5200 100644 --- a/Include/SevenBit/DI/OneOrList.hpp +++ b/Include/SevenBit/DI/OneOrList.hpp @@ -4,9 +4,9 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Meta.hpp" +#include namespace sb::di { @@ -37,9 +37,6 @@ namespace sb::di std::vector &getAsList() { return std::get>(_variant); } const std::vector &getAsList() const { return std::get>(_variant); } - std::variant> &getVariant() { return _variant; } - const std::variant> &getVariant() const { return _variant; } - T &getAsSingle() { return std::get(_variant); } const T &getAsSingle() const { return std::get(_variant); } @@ -57,6 +54,10 @@ namespace sb::di { _variant = std::move(element); } + else if (auto list = tryGetAsList()) + { + list->emplace_back(std::move(element)); + } else { tryConvertToList(); diff --git a/Include/SevenBit/DI/ServiceCollection.hpp b/Include/SevenBit/DI/ServiceCollection.hpp index 6330a6a..746568e 100644 --- a/Include/SevenBit/DI/ServiceCollection.hpp +++ b/Include/SevenBit/DI/ServiceCollection.hpp @@ -5,13 +5,13 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Container.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" -#include "SevenBit/DI/ServiceLifeTimes.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" -#include "SevenBit/DI/ServiceProviderOptions.hpp" +#include +#include +#include +#include +#include namespace sb::di { @@ -79,102 +79,105 @@ namespace sb::di /** * @brief Returns inner vector container */ - std::vector &getInnerVector(); + std::vector &getInnerVector() { return _serviceDescriptors; } /** * @brief Returns inner vector container */ - [[nodiscard]] const std::vector &getInnerVector() const; + [[nodiscard]] const std::vector &getInnerVector() const { return _serviceDescriptors; } /** * @brief Returns service descriptor at giver position * @details might throw exception * @throws std::out_of_range if index >= size() */ - ServiceDescriptor &at(std::size_t index); + ServiceDescriptor &at(const std::size_t index) { return _serviceDescriptors.at(index); } /** * @brief Returns service descriptor at giver position * @details might throw exception * @throws std::out_of_range if index >= size() */ - [[nodiscard]] const ServiceDescriptor &at(std::size_t index) const; + [[nodiscard]] const ServiceDescriptor &at(const std::size_t index) const + { + return _serviceDescriptors.at(index); + } /** * @brief Returns first descriptor * @details might throw exception * @throws std::out_of_range if empty() */ - ServiceDescriptor &first(); + ServiceDescriptor &first() { return at(0); } /** * @brief Returns first descriptor * @details might throw exception * @throws std::out_of_range if empty() */ - [[nodiscard]] const ServiceDescriptor &first() const; + [[nodiscard]] const ServiceDescriptor &first() const { return at(0); } /** * @brief Returns last descriptor * @details might throw exception * @throws std::out_of_range if empty() */ - ServiceDescriptor &last(); + ServiceDescriptor &last() { return at(size() - 1); } /** * @brief Returns last descriptor * @details might throw exception * @throws std::out_of_range if empty() */ - [[nodiscard]] const ServiceDescriptor &last() const; + [[nodiscard]] const ServiceDescriptor &last() const { return at(size() - 1); } /** * @brief Returns service descriptor at giver position * @details might throw exception * @throws std::out_of_range if index >= size() */ - ServiceDescriptor &operator[](std::size_t index); + ServiceDescriptor &operator[](const std::size_t index) { return _serviceDescriptors[index]; } /** * @brief Returns service descriptor at giver position * @details might throw exception * @throws std::out_of_range if index >= size() */ - const ServiceDescriptor &operator[](std::size_t index) const; + const ServiceDescriptor &operator[](const std::size_t index) const { return _serviceDescriptors[index]; } /** * @brief Returns the maximum possible number of stored descriptors */ - [[nodiscard]] std::size_t maxSize() const; + [[nodiscard]] std::size_t maxSize() const { return _serviceDescriptors.max_size(); } /** * @brief Returns number of stored descriptors */ - [[nodiscard]] std::size_t size() const; + [[nodiscard]] std::size_t size() const { return _serviceDescriptors.size(); } /** * @brief Returns number of stored descriptors */ - [[nodiscard]] std::size_t count() const; + [[nodiscard]] std::size_t count() const { return size(); } /** * @brief Returns true if there are no descriptors */ - [[nodiscard]] bool empty() const; + [[nodiscard]] bool empty() const { return _serviceDescriptors.empty(); } /** * @brief Returns capacity */ - [[nodiscard]] std::size_t capacity() const; + [[nodiscard]] std::size_t capacity() const { return _serviceDescriptors.capacity(); } /** * @brief Reserves space for descriptors */ - void reserve(std::size_t space); + void reserve(const std::size_t space) { _serviceDescriptors.reserve(space); } /** * @brief Shrinks to fit current size of descriptors */ - void shrinkToFit(); + void shrinkToFit() { _serviceDescriptors.shrink_to_fit(); } /** * @brief Removes all descriptors */ - void clear(); + void clear() { _serviceDescriptors.clear(); } /** * @brief Find first descriptor meeting TPred requirement @@ -283,7 +286,10 @@ namespace sb::di * @brief Inserts descriptor before giver iterator * @details Returns iterator pointing to the inserted */ - Iterator insert(ConstIterator pos, ServiceDescriptor descriptor); + Iterator insert(ConstIterator pos, ServiceDescriptor descriptor) + { + return _serviceDescriptors.insert(pos, std::move(descriptor)); + } /** * @brief Adds descriptor to the end of list @@ -315,25 +321,25 @@ namespace sb::di * @brief Removes descriptor with given iterator * @details Returns iterator following the last removed element */ - Iterator remove(Iterator pos); + Iterator remove(Iterator pos) { return _serviceDescriptors.erase(pos); } /** * @brief Removes descriptor with given iterator * @details Returns iterator following the last removed element */ - Iterator remove(ConstIterator pos); + Iterator remove(ConstIterator pos) { return _serviceDescriptors.erase(pos); } /** * @brief Removes descriptors between given iterators * @details Returns iterator following the last removed element */ - Iterator removeRange(Iterator begin, Iterator end); + Iterator removeRange(Iterator begin, Iterator end) { return _serviceDescriptors.erase(begin, end); } /** * @brief Removes descriptors between given iterators * @details Returns iterator following the last removed element */ - Iterator removeRange(ConstIterator begin, ConstIterator end); + Iterator removeRange(ConstIterator begin, ConstIterator end) { return _serviceDescriptors.erase(begin, end); } /** * @brief Removes all descriptors meeting TPred requirement @@ -437,7 +443,7 @@ namespace sb::di /** * @brief Removes last descriptor */ - void pop(); + void pop() { _serviceDescriptors.pop_back(); } /** * @brief Adds service descriptor @@ -1048,12 +1054,18 @@ namespace sb::di std::make_unique(std::move(serviceAliasKey)), nullptr)); } - friend bool operator==(const ServiceCollection &lhs, const ServiceCollection &rhs); - friend bool operator!=(const ServiceCollection &lhs, const ServiceCollection &rhs); + friend bool operator==(const ServiceCollection &lhs, const ServiceCollection &rhs) + { + return lhs._serviceDescriptors == rhs._serviceDescriptors; + } + friend bool operator!=(const ServiceCollection &lhs, const ServiceCollection &rhs) + { + return lhs._serviceDescriptors != rhs._serviceDescriptors; + } }; } // namespace sb::di #ifdef _7BIT_DI_ADD_IMPL -#include "SevenBit/DI/Impl/ServiceCollection.hpp" +#include #endif diff --git a/Include/SevenBit/DI/ServiceDescriber.hpp b/Include/SevenBit/DI/ServiceDescriber.hpp index fd3dfb4..0462095 100644 --- a/Include/SevenBit/DI/ServiceDescriber.hpp +++ b/Include/SevenBit/DI/ServiceDescriber.hpp @@ -2,15 +2,15 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp" -#include "SevenBit/DI/Details/Factories/ServiceFactory.hpp" -#include "SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp" -#include "SevenBit/DI/Details/Utils/Assert.hpp" -#include "SevenBit/DI/Details/Utils/Cast.hpp" -#include "SevenBit/DI/ServiceDescriptor.hpp" -#include "SevenBit/DI/ServiceLifeTimes.hpp" +#include +#include +#include +#include +#include +#include +#include namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceDescriptor.hpp b/Include/SevenBit/DI/ServiceDescriptor.hpp index c9fc702..f4d8dba 100644 --- a/Include/SevenBit/DI/ServiceDescriptor.hpp +++ b/Include/SevenBit/DI/ServiceDescriptor.hpp @@ -3,11 +3,11 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/IServiceFactory.hpp" -#include "SevenBit/DI/ServiceLifeTime.hpp" -#include "SevenBit/DI/TypeId.hpp" +#include +#include +#include namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceInstance.hpp b/Include/SevenBit/DI/ServiceInstance.hpp index 68115ab..b5b238c 100644 --- a/Include/SevenBit/DI/ServiceInstance.hpp +++ b/Include/SevenBit/DI/ServiceInstance.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Cast.hpp" -#include "SevenBit/DI/IServiceInstance.hpp" +#include +#include namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceLifeTime.hpp b/Include/SevenBit/DI/ServiceLifeTime.hpp index 48d7b5c..03b5de8 100644 --- a/Include/SevenBit/DI/ServiceLifeTime.hpp +++ b/Include/SevenBit/DI/ServiceLifeTime.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Require.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceLifeTimes.hpp b/Include/SevenBit/DI/ServiceLifeTimes.hpp index 41e03dd..d801668 100644 --- a/Include/SevenBit/DI/ServiceLifeTimes.hpp +++ b/Include/SevenBit/DI/ServiceLifeTimes.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/ServiceLifeTime.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceProvider.hpp b/Include/SevenBit/DI/ServiceProvider.hpp index 4d5fd35..176570f 100644 --- a/Include/SevenBit/DI/ServiceProvider.hpp +++ b/Include/SevenBit/DI/ServiceProvider.hpp @@ -4,11 +4,11 @@ #include #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Utils/Require.hpp" -#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" -#include "SevenBit/DI/IServiceInstanceProvider.hpp" +#include +#include +#include namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceProviderOptions.hpp b/Include/SevenBit/DI/ServiceProviderOptions.hpp index c4265d2..406190c 100644 --- a/Include/SevenBit/DI/ServiceProviderOptions.hpp +++ b/Include/SevenBit/DI/ServiceProviderOptions.hpp @@ -1,6 +1,6 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/TypeId.hpp b/Include/SevenBit/DI/TypeId.hpp index 5fa7a9f..0a87743 100644 --- a/Include/SevenBit/DI/TypeId.hpp +++ b/Include/SevenBit/DI/TypeId.hpp @@ -2,7 +2,7 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/Utils/GlobalServices.hpp b/Include/SevenBit/DI/Utils/GlobalServices.hpp index 38304b7..780c237 100644 --- a/Include/SevenBit/DI/Utils/GlobalServices.hpp +++ b/Include/SevenBit/DI/Utils/GlobalServices.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/ServiceCollection.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/Utils/Injected.hpp b/Include/SevenBit/DI/Utils/Injected.hpp index ea3a0d2..4d00f92 100644 --- a/Include/SevenBit/DI/Utils/Injected.hpp +++ b/Include/SevenBit/DI/Utils/Injected.hpp @@ -1,9 +1,9 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Utils/Register.hpp" -#include "SevenBit/DI/Utils/ServiceExtractor.hpp" +#include +#include namespace sb::di { diff --git a/Include/SevenBit/DI/Utils/Register.hpp b/Include/SevenBit/DI/Utils/Register.hpp index 9049966..89b570e 100644 --- a/Include/SevenBit/DI/Utils/Register.hpp +++ b/Include/SevenBit/DI/Utils/Register.hpp @@ -1,8 +1,8 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Utils/GlobalServices.hpp" +#include namespace sb::di { diff --git a/Include/SevenBit/DI/Utils/ServiceExtractor.hpp b/Include/SevenBit/DI/Utils/ServiceExtractor.hpp index eba0b53..4541715 100644 --- a/Include/SevenBit/DI/Utils/ServiceExtractor.hpp +++ b/Include/SevenBit/DI/Utils/ServiceExtractor.hpp @@ -2,10 +2,10 @@ #include -#include "SevenBit/DI/LibraryConfig.hpp" +#include -#include "SevenBit/DI/Details/Helpers/ServiceGetter.hpp" -#include "SevenBit/DI/Details/Utils/Meta.hpp" +#include +#include namespace sb::di { diff --git a/SingleHeader/SevenBitDI.hpp.in b/SingleHeader/SevenBitDI.hpp.in index eedcaef..71f2535 100644 --- a/SingleHeader/SevenBitDI.hpp.in +++ b/SingleHeader/SevenBitDI.hpp.in @@ -2,4 +2,4 @@ #define _7BIT_DI_HEADER_ONLY_LIB -#include "SevenBit/DI.hpp" \ No newline at end of file +#include diff --git a/Source/ConfigCheck.hpp b/Source/ConfigCheck.hpp index 2693351..6579ecf 100644 --- a/Source/ConfigCheck.hpp +++ b/Source/ConfigCheck.hpp @@ -1,6 +1,6 @@ #pragma once -#include "SevenBit/DI/LibraryConfig.hpp" +#include #ifndef _7BIT_DI_ADD_IMPL #define _7BIT_DI_ADD_IMPL @@ -10,4 +10,4 @@ #undef INLINE #endif -#define INLINE \ No newline at end of file +#define INLINE diff --git a/Source/Source.cpp b/Source/Source.cpp index e356e08..f039380 100644 --- a/Source/Source.cpp +++ b/Source/Source.cpp @@ -1,17 +1,16 @@ -#include "ConfigCheck.hpp" +#include -#include "SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp" -#include "SevenBit/DI/Details/Containers/Impl/ServiceInstanceList.hpp" -#include "SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp" -#include "SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp" -#include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp" -#include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp" -#include "SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp" -#include "SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp" -#include "SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp" -#include "SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp" -#include "SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp" -#include "SevenBit/DI/Impl/Exceptions.hpp" -#include "SevenBit/DI/Impl/ServiceCollection.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/Tests/Helpers/Classes/Complex.hpp b/Tests/Helpers/Classes/Complex.hpp index 0c35b26..c86bbd4 100644 --- a/Tests/Helpers/Classes/Complex.hpp +++ b/Tests/Helpers/Classes/Complex.hpp @@ -5,8 +5,8 @@ #include -#include "SevenBit/DI/ServiceCollection.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" +#include +#include struct ITestComplexClass1 { diff --git a/Tests/Helpers/Classes/Dependencies.hpp b/Tests/Helpers/Classes/Dependencies.hpp index 8d14641..3c8ac1a 100644 --- a/Tests/Helpers/Classes/Dependencies.hpp +++ b/Tests/Helpers/Classes/Dependencies.hpp @@ -3,7 +3,7 @@ #include #include -#include "SevenBit/DI/ServiceProvider.hpp" +#include struct TestDependencyClass { diff --git a/Tests/Helpers/Classes/Legion.hpp b/Tests/Helpers/Classes/Legion.hpp index 4bf3815..5eb3516 100644 --- a/Tests/Helpers/Classes/Legion.hpp +++ b/Tests/Helpers/Classes/Legion.hpp @@ -1,6 +1,6 @@ #pragma once -#include "SevenBit/DI/ServiceCollection.hpp" +#include template class Legion { diff --git a/Tests/Helpers/Mocks/ServiceInstanceProviderMock.hpp b/Tests/Helpers/Mocks/ServiceInstanceProviderMock.hpp index e9ac599..dc315cf 100644 --- a/Tests/Helpers/Mocks/ServiceInstanceProviderMock.hpp +++ b/Tests/Helpers/Mocks/ServiceInstanceProviderMock.hpp @@ -2,7 +2,7 @@ #include -#include "SevenBit/DI/IServiceInstanceProvider.hpp" +#include struct ServiceInstanceProviderMock : public sb::di::IServiceInstanceProvider { diff --git a/Tests/Helpers/Mocks/ServiceProviderMock.hpp b/Tests/Helpers/Mocks/ServiceProviderMock.hpp index 398873a..2414b5a 100644 --- a/Tests/Helpers/Mocks/ServiceProviderMock.hpp +++ b/Tests/Helpers/Mocks/ServiceProviderMock.hpp @@ -1,11 +1,11 @@ #pragma once #include "ServiceInstanceProviderMock.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" +#include -struct ServiceProviderMock : public sb::di::ServiceProvider +struct ServiceProviderMock : sb::di::ServiceProvider { - ServiceProviderMock() : sb::di::ServiceProvider(prepare()) {} + ServiceProviderMock() : ServiceProvider(prepare()) {} [[nodiscard]] static sb::di::IServiceInstanceProvider::Ptr prepare() { diff --git a/Tests/Integration/AliasTest.cpp b/Tests/Integration/AliasTest.cpp index 286368d..7c1b1c3 100644 --- a/Tests/Integration/AliasTest.cpp +++ b/Tests/Integration/AliasTest.cpp @@ -1,7 +1,7 @@ #include #include "../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class AliasTest : public testing::Test { diff --git a/Tests/Integration/BasicExternalTest.cpp b/Tests/Integration/BasicExternalTest.cpp index 8d215ab..0628d58 100644 --- a/Tests/Integration/BasicExternalTest.cpp +++ b/Tests/Integration/BasicExternalTest.cpp @@ -2,8 +2,8 @@ #include #include "../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class BasicExternalTest : public testing::Test { diff --git a/Tests/Integration/BasicFactoryTest.cpp b/Tests/Integration/BasicFactoryTest.cpp index 884232b..dc2da93 100644 --- a/Tests/Integration/BasicFactoryTest.cpp +++ b/Tests/Integration/BasicFactoryTest.cpp @@ -3,8 +3,8 @@ #include "../Helpers/Classes/Basic.hpp" #include "../Helpers/Classes/CirularDependency.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class BasicFactoryTest : public testing::Test { diff --git a/Tests/Integration/BasicTest.cpp b/Tests/Integration/BasicTest.cpp index ed772c8..9b3752e 100644 --- a/Tests/Integration/BasicTest.cpp +++ b/Tests/Integration/BasicTest.cpp @@ -3,8 +3,8 @@ #include "../Helpers/Classes/Basic.hpp" #include "../Helpers/Classes/CirularDependency.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class BasicTest : public testing::Test { diff --git a/Tests/Integration/BasicUniqFactoryTest.cpp b/Tests/Integration/BasicUniqFactoryTest.cpp index 8172678..33d27f4 100644 --- a/Tests/Integration/BasicUniqFactoryTest.cpp +++ b/Tests/Integration/BasicUniqFactoryTest.cpp @@ -4,8 +4,8 @@ #include "../Helpers/Classes/Basic.hpp" #include "../Helpers/Classes/CirularDependency.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class BasicUniqFactoryTest : public testing::Test { diff --git a/Tests/Integration/InheritanceExternalTest.cpp b/Tests/Integration/InheritanceExternalTest.cpp index f9082d7..6d1bf63 100644 --- a/Tests/Integration/InheritanceExternalTest.cpp +++ b/Tests/Integration/InheritanceExternalTest.cpp @@ -2,8 +2,8 @@ #include #include "../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class InheritanceExternalTest : public testing::Test { diff --git a/Tests/Integration/InheritanceFactoryTest.cpp b/Tests/Integration/InheritanceFactoryTest.cpp index 2cb920e..e0d5d36 100644 --- a/Tests/Integration/InheritanceFactoryTest.cpp +++ b/Tests/Integration/InheritanceFactoryTest.cpp @@ -2,8 +2,8 @@ #include #include "../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class InheritanceFactoryTest : public testing::Test { diff --git a/Tests/Integration/InheritanceTest.cpp b/Tests/Integration/InheritanceTest.cpp index 225b493..fcee6f6 100644 --- a/Tests/Integration/InheritanceTest.cpp +++ b/Tests/Integration/InheritanceTest.cpp @@ -2,8 +2,8 @@ #include #include "../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class InheritanceTest : public testing::Test { diff --git a/Tests/Integration/InheritanceUniqFactoryTest.cpp b/Tests/Integration/InheritanceUniqFactoryTest.cpp index 911b1da..5f1236e 100644 --- a/Tests/Integration/InheritanceUniqFactoryTest.cpp +++ b/Tests/Integration/InheritanceUniqFactoryTest.cpp @@ -2,8 +2,8 @@ #include #include "../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class InheritanceUniqFactoryTest : public testing::Test { diff --git a/Tests/Integration/InjectionTest.cpp b/Tests/Integration/InjectionTest.cpp index d64a87a..d0362eb 100644 --- a/Tests/Integration/InjectionTest.cpp +++ b/Tests/Integration/InjectionTest.cpp @@ -2,7 +2,7 @@ #include #include "../Helpers/Classes/Complex.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class InjectionTest : public testing::Test { diff --git a/Tests/Integration/Keyed/AliasKeyedTest.cpp b/Tests/Integration/Keyed/AliasKeyedTest.cpp index 4a30f68..b126932 100644 --- a/Tests/Integration/Keyed/AliasKeyedTest.cpp +++ b/Tests/Integration/Keyed/AliasKeyedTest.cpp @@ -1,7 +1,7 @@ #include #include "../../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class AliasKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/BasicExternalKeyedTest.cpp b/Tests/Integration/Keyed/BasicExternalKeyedTest.cpp index d200dc3..d7373dd 100644 --- a/Tests/Integration/Keyed/BasicExternalKeyedTest.cpp +++ b/Tests/Integration/Keyed/BasicExternalKeyedTest.cpp @@ -2,8 +2,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class BasicExternalKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/BasicFactoryKeyedTest.cpp b/Tests/Integration/Keyed/BasicFactoryKeyedTest.cpp index a63d3db..6eeea59 100644 --- a/Tests/Integration/Keyed/BasicFactoryKeyedTest.cpp +++ b/Tests/Integration/Keyed/BasicFactoryKeyedTest.cpp @@ -2,8 +2,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class BasicFactoryKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/BasicKeyedTest.cpp b/Tests/Integration/Keyed/BasicKeyedTest.cpp index bb21728..d44b077 100644 --- a/Tests/Integration/Keyed/BasicKeyedTest.cpp +++ b/Tests/Integration/Keyed/BasicKeyedTest.cpp @@ -3,8 +3,8 @@ #include "../../Helpers/Classes/Basic.hpp" #include "../../Helpers/Classes/CirularDependency.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class BasicKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/BasicUniqFactoryKeyedTest.cpp b/Tests/Integration/Keyed/BasicUniqFactoryKeyedTest.cpp index e1e9a5b..0040350 100644 --- a/Tests/Integration/Keyed/BasicUniqFactoryKeyedTest.cpp +++ b/Tests/Integration/Keyed/BasicUniqFactoryKeyedTest.cpp @@ -3,8 +3,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class BasicUniqFactoryKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/InheritanceExternalKeyedTest.cpp b/Tests/Integration/Keyed/InheritanceExternalKeyedTest.cpp index 48ffdc7..7cb2146 100644 --- a/Tests/Integration/Keyed/InheritanceExternalKeyedTest.cpp +++ b/Tests/Integration/Keyed/InheritanceExternalKeyedTest.cpp @@ -2,8 +2,8 @@ #include #include "../../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class InheritanceExternalKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/InheritanceFactoryKeyedTest.cpp b/Tests/Integration/Keyed/InheritanceFactoryKeyedTest.cpp index 11d65b8..836b9b4 100644 --- a/Tests/Integration/Keyed/InheritanceFactoryKeyedTest.cpp +++ b/Tests/Integration/Keyed/InheritanceFactoryKeyedTest.cpp @@ -2,8 +2,8 @@ #include #include "../../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class InheritanceFactoryKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/InheritanceKeyedTest.cpp b/Tests/Integration/Keyed/InheritanceKeyedTest.cpp index f497234..4e6d1b4 100644 --- a/Tests/Integration/Keyed/InheritanceKeyedTest.cpp +++ b/Tests/Integration/Keyed/InheritanceKeyedTest.cpp @@ -2,8 +2,8 @@ #include #include "../../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class InheritanceKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/InheritanceUniqFactoryKeyedTest.cpp b/Tests/Integration/Keyed/InheritanceUniqFactoryKeyedTest.cpp index 1bb2d4e..dac2216 100644 --- a/Tests/Integration/Keyed/InheritanceUniqFactoryKeyedTest.cpp +++ b/Tests/Integration/Keyed/InheritanceUniqFactoryKeyedTest.cpp @@ -2,8 +2,8 @@ #include #include "../../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include +#include class InheritanceUniqFactoryKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/MultiInheritanceExternalKeyedTest.cpp b/Tests/Integration/Keyed/MultiInheritanceExternalKeyedTest.cpp index be8119c..8ebd79a 100644 --- a/Tests/Integration/Keyed/MultiInheritanceExternalKeyedTest.cpp +++ b/Tests/Integration/Keyed/MultiInheritanceExternalKeyedTest.cpp @@ -2,7 +2,7 @@ #include #include "../../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class MultiInheritanceExternalKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/MultiInheritanceFactoryKeyedTest.cpp b/Tests/Integration/Keyed/MultiInheritanceFactoryKeyedTest.cpp index e35590a..d8d40b5 100644 --- a/Tests/Integration/Keyed/MultiInheritanceFactoryKeyedTest.cpp +++ b/Tests/Integration/Keyed/MultiInheritanceFactoryKeyedTest.cpp @@ -2,7 +2,7 @@ #include #include "../../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class MultiInheritanceFactoryKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/MultiInheritanceKeyedTest.cpp b/Tests/Integration/Keyed/MultiInheritanceKeyedTest.cpp index e2b62f0..9082537 100644 --- a/Tests/Integration/Keyed/MultiInheritanceKeyedTest.cpp +++ b/Tests/Integration/Keyed/MultiInheritanceKeyedTest.cpp @@ -2,7 +2,7 @@ #include #include "../../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class MultiInheritanceKeyedTest : public testing::Test { diff --git a/Tests/Integration/Keyed/MultiInheritanceUniqFactoryKeyedTest.cpp b/Tests/Integration/Keyed/MultiInheritanceUniqFactoryKeyedTest.cpp index f6a8bdd..6f50abb 100644 --- a/Tests/Integration/Keyed/MultiInheritanceUniqFactoryKeyedTest.cpp +++ b/Tests/Integration/Keyed/MultiInheritanceUniqFactoryKeyedTest.cpp @@ -2,7 +2,7 @@ #include #include "../../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class MultiInheritanceUniqFactoryKeyedTest : public testing::Test { diff --git a/Tests/Integration/MultiInheritanceExternalTest.cpp b/Tests/Integration/MultiInheritanceExternalTest.cpp index 3de2861..9e0753f 100644 --- a/Tests/Integration/MultiInheritanceExternalTest.cpp +++ b/Tests/Integration/MultiInheritanceExternalTest.cpp @@ -2,7 +2,7 @@ #include #include "../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class MultiInheritanceExternalTest : public testing::Test { diff --git a/Tests/Integration/MultiInheritanceFactoryTest.cpp b/Tests/Integration/MultiInheritanceFactoryTest.cpp index 91d7a2f..eea7107 100644 --- a/Tests/Integration/MultiInheritanceFactoryTest.cpp +++ b/Tests/Integration/MultiInheritanceFactoryTest.cpp @@ -2,7 +2,7 @@ #include #include "../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class MultiInheritanceFactoryTest : public testing::Test { diff --git a/Tests/Integration/MultiInheritanceTest.cpp b/Tests/Integration/MultiInheritanceTest.cpp index fa50bb7..6e9bd09 100644 --- a/Tests/Integration/MultiInheritanceTest.cpp +++ b/Tests/Integration/MultiInheritanceTest.cpp @@ -2,7 +2,7 @@ #include #include "../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class MultiInheritanceTest : public testing::Test { diff --git a/Tests/Integration/MultiInheritanceUniqFactoryTest.cpp b/Tests/Integration/MultiInheritanceUniqFactoryTest.cpp index c4dff2e..a1115c4 100644 --- a/Tests/Integration/MultiInheritanceUniqFactoryTest.cpp +++ b/Tests/Integration/MultiInheritanceUniqFactoryTest.cpp @@ -2,7 +2,7 @@ #include #include "../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class MultiInheritanceUniqFactoryTest : public testing::Test { diff --git a/Tests/Integration/ScopeTest.cpp b/Tests/Integration/ScopeTest.cpp index 217e330..17b4c9b 100644 --- a/Tests/Integration/ScopeTest.cpp +++ b/Tests/Integration/ScopeTest.cpp @@ -4,7 +4,7 @@ #include "../Helpers/Classes/Basic.hpp" #include "../Helpers/Classes/Complex.hpp" #include "../Helpers/Classes/Dependencies.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class ScopeTest : public testing::Test { diff --git a/Tests/Unit/Containers/ServiceDescriptorListTest.cpp b/Tests/Unit/Containers/ServiceDescriptorListTest.cpp index 84c5baf..8c84c0c 100644 --- a/Tests/Unit/Containers/ServiceDescriptorListTest.cpp +++ b/Tests/Unit/Containers/ServiceDescriptorListTest.cpp @@ -1,9 +1,9 @@ #include #include "../../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" +#include +#include +#include class ServiceDescriptorListTest : public testing::Test { diff --git a/Tests/Unit/Containers/ServiceDescriptorsMapTest.cpp b/Tests/Unit/Containers/ServiceDescriptorsMapTest.cpp index 74e424a..7f2e570 100644 --- a/Tests/Unit/Containers/ServiceDescriptorsMapTest.cpp +++ b/Tests/Unit/Containers/ServiceDescriptorsMapTest.cpp @@ -1,8 +1,8 @@ #include #include "../../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" +#include +#include class ServiceDescriptorsMapTest : public testing::Test { diff --git a/Tests/Unit/Containers/ServiceInstanceListTest.cpp b/Tests/Unit/Containers/ServiceInstanceListTest.cpp index 53a2a98..a97d180 100644 --- a/Tests/Unit/Containers/ServiceInstanceListTest.cpp +++ b/Tests/Unit/Containers/ServiceInstanceListTest.cpp @@ -2,11 +2,11 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" -#include "SevenBit/DI/Details/Services/ExternalService.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" -#include "SevenBit/DI/Details/Services/UniquePtrService.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include +#include +#include +#include class ServiceInstanceListTest : public testing::Test { @@ -34,24 +34,6 @@ TEST_F(ServiceInstanceListTest, ShouldAddServices) list.add(sb::di::ServiceInstance{std::move(implementation2)}); } -TEST_F(ServiceInstanceListTest, ShouldFailAddNullService) -{ - auto act = [&] { sb::di::details::ServiceInstanceList list{sb::di::ServiceInstance{}}; }; - - // EXPECT_THROW(act(), sb::di::InvalidServiceException); -} - -TEST_F(ServiceInstanceListTest, ShouldFailAddInvalidService) -{ - auto act = [&] { - auto implementation = - std::make_unique>(std::unique_ptr{}); - sb::di::details::ServiceInstanceList list{sb::di::ServiceInstance{std::move(implementation)}}; - }; - - // EXPECT_THROW(act(), sb::di::InvalidServiceException); -} - TEST_F(ServiceInstanceListTest, ShouldReturnProperSize) { auto implementation = std::make_unique>(); diff --git a/Tests/Unit/Containers/ServiceInstancesMapTest.cpp b/Tests/Unit/Containers/ServiceInstancesMapTest.cpp index dfb2bdd..ebf0331 100644 --- a/Tests/Unit/Containers/ServiceInstancesMapTest.cpp +++ b/Tests/Unit/Containers/ServiceInstancesMapTest.cpp @@ -5,9 +5,9 @@ #include "../../Helpers/Classes/Inherit.hpp" #include "../../Helpers/Classes/InheritDesctuction.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" -#include "SevenBit/DI/Details/Services/ExternalService.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" +#include +#include +#include class ServiceInstancesMapTest : public testing::Test { diff --git a/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp b/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp index d128776..9417a85 100644 --- a/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp +++ b/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp @@ -5,9 +5,9 @@ // #include "../../Helpers/Classes/CirularDependency.hpp" // #include "../../Helpers/Classes/Inherit.hpp" // #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -// #include "SevenBit/DI/Details/Core/ServiceInstanceCreator.hpp" -// #include "SevenBit/DI/Exceptions.hpp" -// #include "SevenBit/DI/ServiceDescriber.hpp" +// #include +// #include +// #include // // class ServiceInstanceCreatorTest : public testing::Test // { diff --git a/Tests/Unit/Core/ServiceInstanceProviderRootTest.cpp b/Tests/Unit/Core/ServiceInstanceProviderRootTest.cpp index 4384731..e90cd2f 100644 --- a/Tests/Unit/Core/ServiceInstanceProviderRootTest.cpp +++ b/Tests/Unit/Core/ServiceInstanceProviderRootTest.cpp @@ -4,9 +4,9 @@ #include "../../Helpers/Classes/Basic.hpp" #include "../../Helpers/Classes/Inherit.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" +#include +#include +#include class ServiceInstanceProviderRootTest : public testing::Test { diff --git a/Tests/Unit/Core/ServiceInstanceResolverTest.cpp b/Tests/Unit/Core/ServiceInstanceResolverTest.cpp index e403e3b..156bd78 100644 --- a/Tests/Unit/Core/ServiceInstanceResolverTest.cpp +++ b/Tests/Unit/Core/ServiceInstanceResolverTest.cpp @@ -4,8 +4,8 @@ // #include "../../Helpers/Classes/Basic.hpp" // #include "../../Helpers/Classes/Inherit.hpp" // #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -// #include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" -// #include "SevenBit/DI/ServiceDescriber.hpp" +// #include +// #include // // class ServiceInstanceResolverTest : public testing::Test // { diff --git a/Tests/Unit/Factories/ExternalServiceFactoryTest.cpp b/Tests/Unit/Factories/ExternalServiceFactoryTest.cpp index cf07b21..d1ebd1d 100644 --- a/Tests/Unit/Factories/ExternalServiceFactoryTest.cpp +++ b/Tests/Unit/Factories/ExternalServiceFactoryTest.cpp @@ -2,7 +2,7 @@ #include "../../Helpers/Classes/Basic.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp" +#include class ExternalServiceFactoryTest : public testing::Test { diff --git a/Tests/Unit/Factories/ServiceFactoryTest.cpp b/Tests/Unit/Factories/ServiceFactoryTest.cpp index 0cf370c..f7314ae 100644 --- a/Tests/Unit/Factories/ServiceFactoryTest.cpp +++ b/Tests/Unit/Factories/ServiceFactoryTest.cpp @@ -4,7 +4,7 @@ #include "../../Helpers/Classes/Complex.hpp" #include "../../Helpers/Classes/Dependencies.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Factories/ServiceFactory.hpp" +#include class ServiceFactoryTest : public testing::Test { diff --git a/Tests/Unit/Factories/ServiceFcnFactoryTest.cpp b/Tests/Unit/Factories/ServiceFcnFactoryTest.cpp index 407c86e..99673d8 100644 --- a/Tests/Unit/Factories/ServiceFcnFactoryTest.cpp +++ b/Tests/Unit/Factories/ServiceFcnFactoryTest.cpp @@ -4,7 +4,7 @@ #include "../../Helpers/Classes/Basic.hpp" #include "../../Helpers/Classes/Dependencies.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp" +#include class ServiceFcnFactoryTest : public testing::Test { diff --git a/Tests/Unit/Helpers/CircularDependencyGuardTest.cpp b/Tests/Unit/Helpers/CircularDependencyGuardTest.cpp index 5a6111f..2106f22 100644 --- a/Tests/Unit/Helpers/CircularDependencyGuardTest.cpp +++ b/Tests/Unit/Helpers/CircularDependencyGuardTest.cpp @@ -1,8 +1,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include class CircularDependencyGuardTest : public testing::Test { diff --git a/Tests/Unit/Helpers/CtorInjectorTest.cpp b/Tests/Unit/Helpers/CtorInjectorTest.cpp index d2f50b0..0c83131 100644 --- a/Tests/Unit/Helpers/CtorInjectorTest.cpp +++ b/Tests/Unit/Helpers/CtorInjectorTest.cpp @@ -2,8 +2,8 @@ #include "../../Helpers/Classes/Dependencies.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Helpers/CtorInjector.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" +#include +#include class CtorInjectorTest : public testing::Test { diff --git a/Tests/Unit/Helpers/FunctorInjectorTest.cpp b/Tests/Unit/Helpers/FunctorInjectorTest.cpp index 3ec1eb2..ae848e9 100644 --- a/Tests/Unit/Helpers/FunctorInjectorTest.cpp +++ b/Tests/Unit/Helpers/FunctorInjectorTest.cpp @@ -2,8 +2,8 @@ #include "../../Helpers/Classes/Dependencies.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Helpers/FunctorInjector.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" +#include +#include class FunctorInjectorTest : public testing::Test { diff --git a/Tests/Unit/Helpers/ScopeGuardTest.cpp b/Tests/Unit/Helpers/ScopeGuardTest.cpp index 4b61172..349a2f2 100644 --- a/Tests/Unit/Helpers/ScopeGuardTest.cpp +++ b/Tests/Unit/Helpers/ScopeGuardTest.cpp @@ -1,8 +1,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Helpers/ScopedGuard.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include class ScopeGuardTest : public testing::Test { diff --git a/Tests/Unit/Helpers/ServiceGetterTest.cpp b/Tests/Unit/Helpers/ServiceGetterTest.cpp index 6a1a608..5469993 100644 --- a/Tests/Unit/Helpers/ServiceGetterTest.cpp +++ b/Tests/Unit/Helpers/ServiceGetterTest.cpp @@ -2,9 +2,9 @@ #include "../../Helpers/Classes/Dependencies.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -#include "SevenBit/DI/Details/Helpers/ServiceGetter.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" -#include "SevenBit/DI/Details/Services/UniquePtrService.hpp" +#include +#include +#include class ServiceGetterTest : public testing::Test { diff --git a/Tests/Unit/OneOrListTest.cpp b/Tests/Unit/OneOrListTest.cpp index 619cbd3..da99ae4 100644 --- a/Tests/Unit/OneOrListTest.cpp +++ b/Tests/Unit/OneOrListTest.cpp @@ -1,6 +1,6 @@ #include -#include "SevenBit/DI/OneOrList.hpp" +#include class OneOrListTest : public testing::Test { @@ -18,6 +18,23 @@ class OneOrListTest : public testing::Test static void TearDownTestSuite() {} }; +TEST_F(OneOrListTest, ShouldCreateUninitialized) +{ + sb::di::OneOrList list; + + EXPECT_TRUE(list.isUninitialized()); + EXPECT_TRUE(list.empty()); +} + +TEST_F(OneOrListTest, ShouldCheck) +{ + sb::di::OneOrList list; + + EXPECT_FALSE(list); + list.add(1); + EXPECT_TRUE(list); +} + TEST_F(OneOrListTest, ShouldCreateSingle) { sb::di::OneOrList list{2}; @@ -49,8 +66,9 @@ TEST_F(OneOrListTest, ShouldMove) TEST_F(OneOrListTest, ShouldAdd) { - sb::di::OneOrList list{2}; + sb::di::OneOrList list; + list.add(2); list.add(3); list.add(4); @@ -104,7 +122,10 @@ TEST_F(OneOrListTest, ShouldGetIndexed) TEST_F(OneOrListTest, ShouldGetSize) { - sb::di::OneOrList list{2}; + sb::di::OneOrList list; + + EXPECT_EQ(list.size(), 0); + list.add(2); EXPECT_EQ(list.size(), 1); @@ -119,7 +140,11 @@ TEST_F(OneOrListTest, ShouldGetSize) TEST_F(OneOrListTest, ShouldGetEmpty) { - sb::di::OneOrList list{2}; + sb::di::OneOrList list; + + EXPECT_TRUE(list.empty()); + + list.add(2); EXPECT_FALSE(list.empty()); @@ -197,6 +222,22 @@ TEST_F(OneOrListTest, ShouldTryGetAsSingle) EXPECT_FALSE(list.tryGetAsSingle()); } +TEST_F(OneOrListTest, ShouldClear) +{ + sb::di::OneOrList list{2}; + EXPECT_FALSE(list.empty()); + + list.clear(); + EXPECT_TRUE(list.empty()); + + list.add(2); + list.add(2); + EXPECT_FALSE(list.empty()); + + list.clear(); + EXPECT_TRUE(list.empty()); +} + TEST_F(OneOrListTest, ShouldForEach) { sb::di::OneOrList list{2}; diff --git a/Tests/Unit/ServiceCollectionTest.cpp b/Tests/Unit/ServiceCollectionTest.cpp index c85370d..fd0c4e6 100644 --- a/Tests/Unit/ServiceCollectionTest.cpp +++ b/Tests/Unit/ServiceCollectionTest.cpp @@ -5,7 +5,7 @@ #include "../Helpers/Classes/Basic.hpp" #include "../Helpers/Classes/Complex.hpp" #include "../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/ServiceCollection.hpp" +#include class ServiceCollectionTest : public testing::Test { @@ -134,7 +134,7 @@ TEST_F(ServiceCollectionTest, ShouldGetWithIndexOperator) EXPECT_EQ(four.getServiceTypeId(), typeid(TestInheritClass1)); EXPECT_EQ(four.getImplementationTypeId(), typeid(TestInheritClass5)); - EXPECT_ANY_THROW(services[10]); + EXPECT_NO_THROW(services[10]); } TEST_F(ServiceCollectionTest, ShouldGetSize) diff --git a/Tests/Unit/ServiceDescriberTest.cpp b/Tests/Unit/ServiceDescriberTest.cpp index 641d0b5..2a6e85f 100644 --- a/Tests/Unit/ServiceDescriberTest.cpp +++ b/Tests/Unit/ServiceDescriberTest.cpp @@ -3,9 +3,9 @@ #include "../Helpers/Classes/Basic.hpp" #include "../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" +#include +#include +#include class ServiceDescriberTest : public testing::Test { diff --git a/Tests/Unit/ServiceDescriptorTest.cpp b/Tests/Unit/ServiceDescriptorTest.cpp index bb2846f..3fbedc1 100644 --- a/Tests/Unit/ServiceDescriptorTest.cpp +++ b/Tests/Unit/ServiceDescriptorTest.cpp @@ -3,8 +3,8 @@ #include "../Helpers/Classes/Basic.hpp" #include "../Helpers/Classes/Complex.hpp" -#include "SevenBit/DI/Details/Factories/ServiceFactory.hpp" -#include "SevenBit/DI/ServiceDescriptor.hpp" +#include +#include class ServiceDescriptorTest : public testing::Test { diff --git a/Tests/Unit/ServiceInstanceTest.cpp b/Tests/Unit/ServiceInstanceTest.cpp index 839fe9f..e4524b8 100644 --- a/Tests/Unit/ServiceInstanceTest.cpp +++ b/Tests/Unit/ServiceInstanceTest.cpp @@ -1,9 +1,9 @@ #include #include "../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceInstance.hpp" +#include +#include +#include class ServiceInstanceTest : public testing::Test { diff --git a/Tests/Unit/ServiceLifeTimeTest.cpp b/Tests/Unit/ServiceLifeTimeTest.cpp index 8ebf7f5..13883a0 100644 --- a/Tests/Unit/ServiceLifeTimeTest.cpp +++ b/Tests/Unit/ServiceLifeTimeTest.cpp @@ -1,6 +1,6 @@ #include -#include "SevenBit/DI/ServiceLifeTimes.hpp" +#include class ServiceLifeTime : public testing::Test { diff --git a/Tests/Unit/ServiceProviderTest.cpp b/Tests/Unit/ServiceProviderTest.cpp index 7b596be..0669b51 100644 --- a/Tests/Unit/ServiceProviderTest.cpp +++ b/Tests/Unit/ServiceProviderTest.cpp @@ -1,7 +1,7 @@ #include -#include "SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp" -#include "SevenBit/DI/ServiceProvider.hpp" +#include +#include class ServiceProviderTest : public testing::Test { diff --git a/Tests/Unit/Services/AliasServiceTest.cpp b/Tests/Unit/Services/AliasServiceTest.cpp index 41ca9e1..20b84c7 100644 --- a/Tests/Unit/Services/AliasServiceTest.cpp +++ b/Tests/Unit/Services/AliasServiceTest.cpp @@ -1,8 +1,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Services/AliasService.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include class AliasServiceTest : public testing::Test { diff --git a/Tests/Unit/Services/ExternalServiceTest.cpp b/Tests/Unit/Services/ExternalServiceTest.cpp index 99b5993..ae74afe 100644 --- a/Tests/Unit/Services/ExternalServiceTest.cpp +++ b/Tests/Unit/Services/ExternalServiceTest.cpp @@ -1,8 +1,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Services/ExternalService.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include class ExternalServiceTest : public testing::Test { diff --git a/Tests/Unit/Services/InPlaceServiceTest.cpp b/Tests/Unit/Services/InPlaceServiceTest.cpp index cb46d26..438f187 100644 --- a/Tests/Unit/Services/InPlaceServiceTest.cpp +++ b/Tests/Unit/Services/InPlaceServiceTest.cpp @@ -2,8 +2,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include class InPlaceServiceTest : public testing::Test { diff --git a/Tests/Unit/Services/UniquePtrServiceTest.cpp b/Tests/Unit/Services/UniquePtrServiceTest.cpp index 4922a55..3817a0a 100644 --- a/Tests/Unit/Services/UniquePtrServiceTest.cpp +++ b/Tests/Unit/Services/UniquePtrServiceTest.cpp @@ -2,8 +2,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Services/UniquePtrService.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include class UniquePtrServiceTest : public testing::Test { diff --git a/Tests/Unit/Utils/CastTest.cpp b/Tests/Unit/Utils/CastTest.cpp index 8ef8ec7..cf57e39 100644 --- a/Tests/Unit/Utils/CastTest.cpp +++ b/Tests/Unit/Utils/CastTest.cpp @@ -1,8 +1,8 @@ #include #include "../../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" -#include "SevenBit/DI/Details/Utils/Cast.hpp" +#include +#include class CastTest : public testing::Test { diff --git a/Tests/Unit/Utils/CheckTest.cpp b/Tests/Unit/Utils/CheckTest.cpp index ecb65f4..38d1e6d 100644 --- a/Tests/Unit/Utils/CheckTest.cpp +++ b/Tests/Unit/Utils/CheckTest.cpp @@ -1,6 +1,6 @@ #include -#include "SevenBit/DI/Details/Utils/Check.hpp" +#include class CheckTest : public testing::Test { diff --git a/Tests/Unit/Utils/CtorParamsNumberTest.cpp b/Tests/Unit/Utils/CtorParamsNumberTest.cpp index 07929ef..8589212 100644 --- a/Tests/Unit/Utils/CtorParamsNumberTest.cpp +++ b/Tests/Unit/Utils/CtorParamsNumberTest.cpp @@ -1,7 +1,7 @@ #include #include "../../Helpers/Classes/Complex.hpp" -#include "SevenBit/DI/Details/Utils/CtorParamsNumber.hpp" +#include class CtorParamsNumberTest : public testing::Test { diff --git a/Tests/Unit/Utils/MetaTest.cpp b/Tests/Unit/Utils/MetaTest.cpp index ba1d058..2ed9793 100644 --- a/Tests/Unit/Utils/MetaTest.cpp +++ b/Tests/Unit/Utils/MetaTest.cpp @@ -2,7 +2,7 @@ #include "../../Helpers/Classes/Complex.hpp" #include "../../Helpers/Classes/MultiInherit.hpp" -#include "SevenBit/DI/Details/Utils/Meta.hpp" +#include class MetaTest : public testing::Test { diff --git a/Tests/Unit/Utils/RequireDescriptorTest.cpp b/Tests/Unit/Utils/RequireDescriptorTest.cpp index 639dd48..8527aed 100644 --- a/Tests/Unit/Utils/RequireDescriptorTest.cpp +++ b/Tests/Unit/Utils/RequireDescriptorTest.cpp @@ -2,9 +2,9 @@ #include "../../Helpers/Classes/Basic.hpp" #include "../../Helpers/Classes/Inherit.hpp" -#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" +#include +#include +#include class RequireDescriptorTest : public testing::Test { diff --git a/Tests/Unit/Utils/RequireInstanceTest.cpp b/Tests/Unit/Utils/RequireInstanceTest.cpp index 06a5f1d..2c163c1 100644 --- a/Tests/Unit/Utils/RequireInstanceTest.cpp +++ b/Tests/Unit/Utils/RequireInstanceTest.cpp @@ -1,12 +1,12 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Services/ExternalService.hpp" -#include "SevenBit/DI/Details/Services/InPlaceService.hpp" -#include "SevenBit/DI/Details/Services/UniquePtrService.hpp" -#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" -#include "SevenBit/DI/Exceptions.hpp" -#include "SevenBit/DI/ServiceDescriber.hpp" +#include +#include +#include +#include +#include +#include class RequireInstanceTest : public testing::Test { diff --git a/Tests/Unit/Utils/RequireTest.cpp b/Tests/Unit/Utils/RequireTest.cpp index 2fcb34c..9d5e9ac 100644 --- a/Tests/Unit/Utils/RequireTest.cpp +++ b/Tests/Unit/Utils/RequireTest.cpp @@ -1,8 +1,8 @@ #include #include "../../Helpers/Classes/Basic.hpp" -#include "SevenBit/DI/Details/Utils/Require.hpp" -#include "SevenBit/DI/Exceptions.hpp" +#include +#include class RequireTest : public testing::Test { From 42bacc9be6399adc64eda8f62460b9ac2edad14e Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Tue, 23 Apr 2024 17:25:47 +0200 Subject: [PATCH 12/19] fix non header only build --- Source/Source.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Source.cpp b/Source/Source.cpp index f039380..32a7f14 100644 --- a/Source/Source.cpp +++ b/Source/Source.cpp @@ -1,5 +1,5 @@ -#include +#include "ConfigCheck.hpp" #include #include From 4668f3f5b6b80f401c16b5cf1345012ce84da34e Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Tue, 23 Apr 2024 19:00:38 +0200 Subject: [PATCH 13/19] update version and add tests for alias creator --- CMakeLists.txt | 2 +- Docs/conf.py | 2 +- Docs/getting-started.rst | 4 +- Include/SevenBit/DI/CmakeDef.hpp | 2 +- .../DI/Details/Core/ServiceAliasesCreator.hpp | 8 +- .../Details/Core/ServiceInstancesCreator.hpp | 12 +- README.md | 4 +- Tests/Unit/Core/ServiceAliasesCreatorTest.cpp | 188 ++++++++ .../Unit/Core/ServiceInstanceCreatorTest.cpp | 141 ------ .../Unit/Core/ServiceInstanceResolverTest.cpp | 452 ------------------ .../Unit/Core/ServiceInstancesCreatorTest.cpp | 279 +++++++++++ Tests/Unit/ServiceCollectionTest.cpp | 2 - 12 files changed, 483 insertions(+), 613 deletions(-) create mode 100644 Tests/Unit/Core/ServiceAliasesCreatorTest.cpp delete mode 100644 Tests/Unit/Core/ServiceInstanceCreatorTest.cpp delete mode 100644 Tests/Unit/Core/ServiceInstanceResolverTest.cpp create mode 100644 Tests/Unit/Core/ServiceInstancesCreatorTest.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b950b3..9e5854f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.15.0) set(_7BIT_DI_LIBRARY 7bitDI) set(_7BIT_DI_VERSION_MAJOR 3) -set(_7BIT_DI_VERSION_MINOR 1) +set(_7BIT_DI_VERSION_MINOR 2) set(_7BIT_DI_VERSION_PATCH 0) set(_7BIT_DI_VERSION ${_7BIT_DI_VERSION_MAJOR}.${_7BIT_DI_VERSION_MINOR}.${_7BIT_DI_VERSION_PATCH}) diff --git a/Docs/conf.py b/Docs/conf.py index ee0c007..5ec2320 100644 --- a/Docs/conf.py +++ b/Docs/conf.py @@ -12,7 +12,7 @@ def createIfNotExists(path): project = "7bitDI" copyright = "2023, 7BitCoder Sylwester Dawida" author = "Sylwester Dawida" -version = "3.1.0" +version = "3.2.0" extensions = [ "sphinx.ext.autodoc", diff --git a/Docs/getting-started.rst b/Docs/getting-started.rst index b2e497e..79fb6e7 100644 --- a/Docs/getting-started.rst +++ b/Docs/getting-started.rst @@ -36,7 +36,7 @@ Installation FetchContent_Declare( 7bitDI GIT_REPOSITORY https://github.com/7bitcoder/7bitDI.git - GIT_TAG v3.1.0 + GIT_TAG v3.2.0 ) FetchContent_MakeAvailable(7bitDI) @@ -48,7 +48,7 @@ Installation .. code-block:: Txt [requires] - 7bitdi/3.1.0 + 7bitdi/3.2.0 change the version to newer if available, then run the command: diff --git a/Include/SevenBit/DI/CmakeDef.hpp b/Include/SevenBit/DI/CmakeDef.hpp index 1f3aa90..9dcd81a 100644 --- a/Include/SevenBit/DI/CmakeDef.hpp +++ b/Include/SevenBit/DI/CmakeDef.hpp @@ -13,5 +13,5 @@ #endif #define _7BIT_DI_VERSION_MAJOR 3 -#define _7BIT_DI_VERSION_MINOR 1 +#define _7BIT_DI_VERSION_MINOR 2 /* #undef _7BIT_DI_VERSION_PATCH */ diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp index 5233f34..93984d2 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp @@ -10,8 +10,7 @@ namespace sb::di::details class EXPORT ServiceAliasesCreator { public: - [[nodiscard]] ServiceInstance tryCreate(const ServiceDescriptor &descriptor, - const ServiceInstance *original) const; + ServiceInstance tryCreate(const ServiceDescriptor &descriptor, const ServiceInstance *original) const; template ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const @@ -37,7 +36,7 @@ namespace sb::di::details }); } - [[nodiscard]] ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const; + ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const; template ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const @@ -59,8 +58,7 @@ namespace sb::di::details void tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, OneOrList &&originals) const; - [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, - const ServiceInstance &original) const; + ServiceInstance create(const ServiceDescriptor &descriptor, const ServiceInstance &original) const; }; } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp index e6fc01d..9850018 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp @@ -16,17 +16,17 @@ namespace sb::di::details public: void setServiceProvider(ServiceProvider &serviceProvider) { _serviceProvider = &serviceProvider; } - [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor); - [[nodiscard]] ServiceInstanceList createAll(const ServiceDescriptorList &descriptors); + ServiceInstance create(const ServiceDescriptor &descriptor); + ServiceInstanceList createAll(const ServiceDescriptorList &descriptors); void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); - [[nodiscard]] ServiceInstance createInPlace(const ServiceDescriptor &descriptor); - [[nodiscard]] ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors); + ServiceInstance createInPlace(const ServiceDescriptor &descriptor); + ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors); void createRestInPlace(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); private: - [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest); - [[nodiscard]] ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest); + ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest); + ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest); void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, bool inPlaceRequest); }; } // namespace sb::di::details diff --git a/README.md b/README.md index 59a9e2d..a0f2f5a 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ include(FetchContent) FetchContent_Declare( 7bitDI GIT_REPOSITORY https://github.com/7bitcoder/7bitDI.git - GIT_TAG v3.1.0 + GIT_TAG v3.2.0 ) FetchContent_MakeAvailable(7bitDI) @@ -79,7 +79,7 @@ Download and install A [Conan](https://conan.io/), and create conanfile.txt in t ``` [requires] -7bitdi/3.1.0 +7bitdi/3.2.0 ``` change the version to newer if available, then run the command: diff --git a/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp b/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp new file mode 100644 index 0000000..82c2855 --- /dev/null +++ b/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp @@ -0,0 +1,188 @@ +#include +#include + +#include "../../Helpers/Classes/Basic.hpp" +#include "../../Helpers/Classes/Inherit.hpp" +#include "../../Helpers/Mocks/ServiceProviderMock.hpp" +#include +#include + +class ServiceAliasesCreatorTest : public testing::Test +{ + protected: + static void SetUpTestSuite() {} + + ServiceAliasesCreatorTest() {} + + void SetUp() override {} + + void TearDown() override {} + + ~ServiceAliasesCreatorTest() override = default; + + static void TearDownTestSuite() {} +}; + +TEST_F(ServiceAliasesCreatorTest, ShouldFailCreateAliasForInvalidService) +{ + constexpr sb::di::details::ServiceAliasesCreator creator; + + const auto descriptor = sb::di::ServiceDescriber::describeAlias(); + + const sb::di::ServiceInstance external; + + EXPECT_THROW(creator.tryCreate(descriptor, &external), sb::di::InvalidServiceException); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldFailCreateAliasForNullService) +{ + constexpr sb::di::details::ServiceAliasesCreator creator; + + const auto descriptor = sb::di::ServiceDescriber::describeAlias(); + + TestInheritClass5 *test = nullptr; + const sb::di::ServiceInstance external{std::make_unique>(test)}; + + EXPECT_THROW(creator.tryCreate(descriptor, &external), sb::di::InvalidServiceException); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldFailCreateAliasForWrongDescriptor) +{ + constexpr sb::di::details::ServiceAliasesCreator creator; + + const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); + + TestInheritClass5 *test = nullptr; + const sb::di::ServiceInstance external{std::make_unique>(test)}; + + EXPECT_THROW(creator.tryCreate(descriptor, &external), sb::di::InjectorException); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldCreate) +{ + constexpr sb::di::details::ServiceAliasesCreator creator; + + TestInheritClass6 test; + const sb::di::ServiceInstance external{ + std::make_unique>(&test)}; + + const auto instance = + creator.tryCreate(sb::di::ServiceDescriber::describeAlias(), &external); + + EXPECT_TRUE(instance); + EXPECT_TRUE(instance.isValid()); + EXPECT_TRUE(instance.getAs()); + EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateForNullOriginal) +{ + constexpr sb::di::details::ServiceAliasesCreator creator; + + TestInheritClass6 test; + const sb::di::ServiceInstance external{ + std::make_unique>(&test)}; + + const auto instance = + creator.tryCreate(sb::di::ServiceDescriber::describeAlias(), nullptr); + + EXPECT_FALSE(instance); + EXPECT_FALSE(instance.isValid()); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldCreateAllAliases) +{ + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeAlias()}; + + constexpr sb::di::details::ServiceAliasesCreator creator; + + TestInheritClass3 test3; + TestInheritClass4 test4; + TestInheritClass5 test5; + sb::di::details::ServiceInstanceList externals{ + sb::di::ServiceInstance{std::make_unique>(&test3)}}; + externals.add( + sb::di::ServiceInstance{std::make_unique>(&test4)}); + externals.add( + sb::di::ServiceInstance{std::make_unique>(&test5)}); + + const auto instances = + creator.tryCreateAll(descriptors, [&](const sb::di::ServiceDescriptor &) { return &externals; }); + + EXPECT_EQ(instances.size(), 3); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); + EXPECT_TRUE(instances[1].isValid()); + EXPECT_TRUE(instances[1].getAs()); + EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); + EXPECT_TRUE(instances[2].isValid()); + EXPECT_TRUE(instances[2].getAs()); + EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForEmpty) +{ + sb::di::details::ServiceDescriptorList descriptors; + + constexpr sb::di::details::ServiceAliasesCreator creator; + + sb::di::details::ServiceInstanceList externals; + + const auto instances = + creator.tryCreateAll(descriptors, [&](const sb::di::ServiceDescriptor &) { return &externals; }); + + EXPECT_FALSE(instances); + EXPECT_TRUE(instances.empty()); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForNull) +{ + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeAlias()}; + + constexpr sb::di::details::ServiceAliasesCreator creator; + const auto instances = creator.tryCreateAll( + descriptors, + [&](const sb::di::ServiceDescriptor &) -> sb::di::details::ServiceInstanceList * { return nullptr; }); + + EXPECT_FALSE(instances); + EXPECT_TRUE(instances.empty()); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldCreateRestAliases) +{ + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeAlias()}; + + constexpr sb::di::details::ServiceAliasesCreator creator; + + TestInheritClass3 test3; + TestInheritClass4 test4; + TestInheritClass5 test5; + sb::di::details::ServiceInstanceList externals{ + sb::di::ServiceInstance{std::make_unique>(&test3)}}; + externals.add( + sb::di::ServiceInstance{std::make_unique>(&test4)}); + externals.add( + sb::di::ServiceInstance{std::make_unique>(&test5)}); + + sb::di::details::ServiceInstanceList instances{ + sb::di::ServiceInstance{std::make_unique>(&test5)}}; + + creator.tryCreateRest(descriptors, instances, [&](const sb::di::ServiceDescriptor &) { return &externals; }); + + EXPECT_EQ(instances.size(), 3); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); + EXPECT_TRUE(instances[1].isValid()); + EXPECT_TRUE(instances[1].getAs()); + EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); + EXPECT_TRUE(instances[2].isValid()); + EXPECT_TRUE(instances[2].getAs()); + EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +} diff --git a/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp b/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp deleted file mode 100644 index 9417a85..0000000 --- a/Tests/Unit/Core/ServiceInstanceCreatorTest.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// #include -// #include -// -// #include "../../Helpers/Classes/Basic.hpp" -// #include "../../Helpers/Classes/CirularDependency.hpp" -// #include "../../Helpers/Classes/Inherit.hpp" -// #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -// #include -// #include -// #include -// -// class ServiceInstanceCreatorTest : public testing::Test -// { -// protected: -// static void SetUpTestSuite() {} -// -// ServiceInstanceCreatorTest() {} -// -// void SetUp() override {} -// -// void TearDown() override {} -// -// ~ServiceInstanceCreatorTest() override = default; -// -// static void TearDownTestSuite() {} -// }; -// -// TEST_F(ServiceInstanceCreatorTest, ShouldCreateInstance) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// -// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); -// -// const auto instance = creator.createInstance(descriptor, false); -// -// EXPECT_TRUE(instance); -// EXPECT_TRUE(instance.isValid()); -// EXPECT_TRUE(instance.getAs()); -// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); -// } -// -// TEST_F(ServiceInstanceCreatorTest, ShouldCreateInstanceAlias) -// { -// sb::di::details::ServiceInstanceCreator2 creator; -// -// const auto descriptor = sb::di::ServiceDescriber::describeAlias(); -// -// TestInheritClass5 test; -// const sb::di::ServiceInstance external{ -// std::make_unique>(&test)}; -// const auto instance = creator.createInstanceAlias(descriptor, external); -// -// EXPECT_TRUE(instance.isValid()); -// EXPECT_TRUE(instance.getAs()); -// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -// } -// -// TEST_F(ServiceInstanceCreatorTest, ShouldFailForNullProvider) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// -// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); -// -// EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::NullPointerException); -// } -// -// TEST_F(ServiceInstanceCreatorTest, ShouldFailForInvalidInstance) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// -// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(nullptr); -// -// EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::InvalidServiceException); -// } -// -// TEST_F(ServiceInstanceCreatorTest, ShouldFailFoWringDescriptor) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// -// const auto descriptor = sb::di::ServiceDescriber::describeAlias(); -// -// EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::InjectorException); -// } -// -// TEST_F(ServiceInstanceCreatorTest, ShouldFailForCirculatDependency) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// -// EXPECT_CALL(mock.getMock(), tryGetInstance(sb::di::TypeId{typeid(CircularDependencyA)})) -// .WillOnce(testing::Invoke([&](sb::di::TypeId typeId) { -// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); -// creator.createInstance(descriptor, false); -// return nullptr; -// })); -// -// EXPECT_CALL(mock.getMock(), tryGetInstance(sb::di::TypeId{typeid(CircularDependencyB)})) -// .WillOnce(testing::Invoke([&](sb::di::TypeId typeId) { -// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); -// creator.createInstance(descriptor, false); -// return nullptr; -// })); -// -// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); -// -// EXPECT_THROW(creator.createInstance(descriptor, false), sb::di::CircularDependencyException); -// } -// -// TEST_F(ServiceInstanceCreatorTest, ShouldFailCreateInstanceAliasForNullService) -// { -// sb::di::details::ServiceInstanceCreator2 creator; -// -// const auto descriptor = sb::di::ServiceDescriber::describeAlias(); -// -// TestInheritClass5 *test = nullptr; -// const sb::di::ServiceInstance -// external{std::make_unique>(test)}; -// -// EXPECT_THROW(creator.createInstanceAlias(descriptor, external), sb::di::InvalidServiceException); -// } -// -// TEST_F(ServiceInstanceCreatorTest, ShouldFailCreateInstanceAliasForWrongDescriptor) -// { -// sb::di::details::ServiceInstanceCreator2 creator; -// -// const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); -// -// TestInheritClass5 *test = nullptr; -// const sb::di::ServiceInstance -// external{std::make_unique>(test)}; -// -// EXPECT_THROW(creator.createInstanceAlias(descriptor, external), sb::di::InjectorException); -// } diff --git a/Tests/Unit/Core/ServiceInstanceResolverTest.cpp b/Tests/Unit/Core/ServiceInstanceResolverTest.cpp deleted file mode 100644 index 156bd78..0000000 --- a/Tests/Unit/Core/ServiceInstanceResolverTest.cpp +++ /dev/null @@ -1,452 +0,0 @@ -// #include -// #include -// -// #include "../../Helpers/Classes/Basic.hpp" -// #include "../../Helpers/Classes/Inherit.hpp" -// #include "../../Helpers/Mocks/ServiceProviderMock.hpp" -// #include -// #include -// -// class ServiceInstanceResolverTest : public testing::Test -// { -// protected: -// static void SetUpTestSuite() {} -// -// ServiceInstanceResolverTest() {} -// -// void SetUp() override {} -// -// void TearDown() override {} -// -// ~ServiceInstanceResolverTest() override = default; -// -// static void TearDownTestSuite() {} -// }; -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateInstance) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// const sb::di::details::ServiceDescriptorList -// descriptors{sb::di::ServiceDescriber::describeSingleton()}; -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instance = resolver.create(); -// -// EXPECT_TRUE(instance); -// EXPECT_TRUE(instance.isValid()); -// EXPECT_TRUE(instance.getAs()); -// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateInheritedInstance) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeSingleton()}; -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instance = resolver.create(); -// -// EXPECT_TRUE(instance); -// EXPECT_TRUE(instance.isValid()); -// EXPECT_TRUE(instance.getAs()); -// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInstance) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// const sb::di::details::ServiceDescriptorList -// descriptors{sb::di::ServiceDescriber::describeSingleton()}; -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instances = resolver.createOne(); -// -// EXPECT_EQ(instances.size(), 1); -// EXPECT_TRUE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInheritedInstance) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeSingleton()}; -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instances = resolver.createOne(); -// -// EXPECT_EQ(instances.size(), 1); -// EXPECT_FALSE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInstances) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// const sb::di::details::ServiceDescriptorList -// descriptors{sb::di::ServiceDescriber::describeSingleton()}; -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instances = resolver.createAll(); -// -// EXPECT_EQ(instances.size(), 1); -// EXPECT_TRUE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInheritedInstances) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeSingleton()}; -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instances = resolver.createAll(); -// -// EXPECT_EQ(instances.size(), 3); -// EXPECT_TRUE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); -// EXPECT_TRUE(instances.getInnerList()[1].isValid()); -// EXPECT_TRUE(instances.getInnerList()[1].getAs()); -// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -// EXPECT_TRUE(instances.getInnerList()[2].isValid()); -// EXPECT_TRUE(instances.getInnerList()[2].getAs()); -// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstances) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeSingleton()}; -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// sb::di::details::ServiceInstanceList instances{ -// sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, false)}}; -// resolver.createRest(instances); -// -// EXPECT_EQ(instances.size(), 3); -// EXPECT_TRUE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); -// EXPECT_TRUE(instances.getInnerList()[1].isValid()); -// EXPECT_TRUE(instances.getInnerList()[1].getAs()); -// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -// EXPECT_TRUE(instances.getInnerList()[2].isValid()); -// EXPECT_TRUE(instances.getInnerList()[2].getAs()); -// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateInstanceInPlace) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// const sb::di::details::ServiceDescriptorList -// descriptors{sb::di::ServiceDescriber::describeSingleton()}; -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instance = resolver.createInPlace(); -// -// EXPECT_TRUE(instance); -// EXPECT_TRUE(instance.isValid()); -// EXPECT_TRUE(instance.getAs()); -// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateInheritedInstanceInPlace) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeSingleton()}; -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instance = resolver.createInPlace(); -// -// EXPECT_TRUE(instance); -// EXPECT_TRUE(instance.isValid()); -// EXPECT_TRUE(instance.getAs()); -// EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInstanceInPlace) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// const sb::di::details::ServiceDescriptorList -// descriptors{sb::di::ServiceDescriber::describeSingleton()}; -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instances = resolver.createOneInPlace(); -// -// EXPECT_EQ(instances.size(), 1); -// EXPECT_TRUE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateOneInheritedInstanceInPlace) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeSingleton()}; -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instances = resolver.createOneInPlace(); -// -// EXPECT_EQ(instances.size(), 1); -// EXPECT_FALSE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInstancesInPlace) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// const sb::di::details::ServiceDescriptorList -// descriptors{sb::di::ServiceDescriber::describeSingleton()}; -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instances = resolver.createAllInPlace(); -// -// EXPECT_EQ(instances.size(), 1); -// EXPECT_TRUE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateAllInheritedInstancesInPlace) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeSingleton()}; -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// const auto instances = resolver.createAllInPlace(); -// -// EXPECT_EQ(instances.size(), 3); -// EXPECT_TRUE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); -// EXPECT_TRUE(instances.getInnerList()[1].isValid()); -// EXPECT_TRUE(instances.getInnerList()[1].getAs()); -// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -// EXPECT_TRUE(instances.getInnerList()[2].isValid()); -// EXPECT_TRUE(instances.getInnerList()[2].getAs()); -// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -// } -// -// TEST_F(ServiceInstanceResolverTest, ShouldCreateRestInheritedInstancesInPlace) -// { -// ServiceProviderMock mock; -// sb::di::details::ServiceInstanceCreator2 creator; -// creator.setServiceProvider(mock); -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeSingleton()}; -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// descriptors.add(sb::di::ServiceDescriber::describeSingleton()); -// -// const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// -// sb::di::details::ServiceInstanceList instances{ -// sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, true)}}; -// resolver.createRestInPlace(instances); -// -// EXPECT_EQ(instances.size(), 3); -// EXPECT_TRUE(instances.isSealed()); -// EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); -// EXPECT_TRUE(instances.getInnerList()[1].isValid()); -// EXPECT_TRUE(instances.getInnerList()[1].getAs()); -// EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -// EXPECT_TRUE(instances.getInnerList()[2].isValid()); -// EXPECT_TRUE(instances.getInnerList()[2].getAs()); -// EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); -// } -// -// // TEST_F(ServiceInstanceResolverTest, ShouldCreateAlias) -// // { -// // ServiceProviderMock mock; -// // sb::di::details::ServiceInstanceCreator creator; -// // creator.setServiceProvider(mock); -// // sb::di::details::ServiceDescriptorList descriptors{ -// // sb::di::ServiceDescriber::describeAlias()}; -// // descriptors.add(sb::di::ServiceDescriber::describeAlias()); -// // descriptors.add(sb::di::ServiceDescriber::describeAlias()); -// // -// // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// // -// // TestInheritClass6 test; -// // const sb::di::ServiceInstance external{ -// // std::make_unique>(&test)}; -// // -// // const auto instance = resolver.createAlias(external); -// // -// // EXPECT_TRUE(instance); -// // EXPECT_TRUE(instance.isValid()); -// // EXPECT_TRUE(instance.getAs()); -// // EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -// // } -// // -// // TEST_F(ServiceInstanceResolverTest, ShouldCreateOneAlias) -// // { -// // ServiceProviderMock mock; -// // sb::di::details::ServiceInstanceCreator creator; -// // creator.setServiceProvider(mock); -// // sb::di::details::ServiceDescriptorList descriptors{ -// // sb::di::ServiceDescriber::describeAlias()}; -// // descriptors.add(sb::di::ServiceDescriber::describeAlias()); -// // descriptors.add(sb::di::ServiceDescriber::describeAlias()); -// // -// // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// // -// // TestInheritClass6 test; -// // sb::di::ServiceInstance -// external{std::make_unique>(&test)}; -// // -// // const auto instances = resolver.createOneAlias(external); -// // -// // EXPECT_EQ(instances.size(), 1); -// // EXPECT_FALSE(instances.isSealed()); -// // EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// // EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// // EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); -// // } -// // -// // TEST_F(ServiceInstanceResolverTest, ShouldCreateAllAliases) -// // { -// // ServiceProviderMock mock; -// // sb::di::details::ServiceInstanceCreator creator; -// // creator.setServiceProvider(mock); -// // sb::di::details::ServiceDescriptorList descriptors{ -// // sb::di::ServiceDescriber::describeAlias()}; -// // -// // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// // -// // TestInheritClass3 test3; -// // TestInheritClass4 test4; -// // TestInheritClass5 test5; -// // sb::di::details::ServiceInstanceList externals{ -// // sb::di::ServiceInstance{std::make_unique>(&test3)}}; -// // externals.add( -// // sb::di::ServiceInstance{std::make_unique>(&test4)}); -// // externals.add( -// // sb::di::ServiceInstance{std::make_unique>(&test5)}); -// // -// // const auto instances = resolver.createAllAliases(externals.getInnerList()); -// // -// // EXPECT_EQ(instances.size(), 3); -// // EXPECT_TRUE(instances.isSealed()); -// // EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// // EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// // EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// // EXPECT_TRUE(instances.getInnerList()[1].isValid()); -// // EXPECT_TRUE(instances.getInnerList()[1].getAs()); -// // EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// // EXPECT_TRUE(instances.getInnerList()[2].isValid()); -// // EXPECT_TRUE(instances.getInnerList()[2].getAs()); -// // EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// // } -// // -// // TEST_F(ServiceInstanceResolverTest, ShouldCreateRestAliases) -// // { -// // ServiceProviderMock mock; -// // sb::di::details::ServiceInstanceCreator creator; -// // creator.setServiceProvider(mock); -// // sb::di::details::ServiceDescriptorList descriptors{ -// // sb::di::ServiceDescriber::describeAlias()}; -// // -// // const sb::di::details::ServiceInstancesResolver resolver{creator, descriptors}; -// // -// // TestInheritClass3 test3; -// // TestInheritClass4 test4; -// // TestInheritClass5 test5; -// // sb::di::details::ServiceInstanceList externals{ -// // sb::di::ServiceInstance{std::make_unique>(&test3)}}; -// // externals.add( -// // sb::di::ServiceInstance{std::make_unique>(&test4)}); -// // externals.add( -// // sb::di::ServiceInstance{std::make_unique>(&test5)}); -// // -// // sb::di::details::ServiceInstanceList instances{ -// // sb::di::ServiceInstance{std::make_unique>(&test5)}}; -// // -// // auto &_ = resolver.createRestAliases(externals.getInnerList(), instances); -// // -// // EXPECT_EQ(instances.size(), 3); -// // EXPECT_TRUE(instances.isSealed()); -// // EXPECT_TRUE(instances.getInnerList()[0].isValid()); -// // EXPECT_TRUE(instances.getInnerList()[0].getAs()); -// // EXPECT_EQ(instances.getInnerList()[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// // EXPECT_TRUE(instances.getInnerList()[1].isValid()); -// // EXPECT_TRUE(instances.getInnerList()[1].getAs()); -// // EXPECT_EQ(instances.getInnerList()[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// // EXPECT_TRUE(instances.getInnerList()[2].isValid()); -// // EXPECT_TRUE(instances.getInnerList()[2].getAs()); -// // EXPECT_EQ(instances.getInnerList()[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// // } diff --git a/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp b/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp new file mode 100644 index 0000000..a474c7a --- /dev/null +++ b/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp @@ -0,0 +1,279 @@ +#include +#include + +#include "../../Helpers/Classes/Basic.hpp" +#include "../../Helpers/Classes/CirularDependency.hpp" +#include "../../Helpers/Classes/Inherit.hpp" +#include "../../Helpers/Mocks/ServiceProviderMock.hpp" +#include +#include + +class ServiceInstancesCreatorTest : public testing::Test +{ + protected: + static void SetUpTestSuite() {} + + ServiceInstancesCreatorTest() {} + + void SetUp() override {} + + void TearDown() override {} + + ~ServiceInstancesCreatorTest() override = default; + + static void TearDownTestSuite() {} +}; + +TEST_F(ServiceInstancesCreatorTest, ShouldFailForNullProvider) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + + const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); + + EXPECT_THROW(creator.create(descriptor), sb::di::NullPointerException); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldFailForInvalidInstance) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const auto descriptor = sb::di::ServiceDescriber::describeSingleton(nullptr); + + EXPECT_THROW(creator.create(descriptor), sb::di::InvalidServiceException); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldFailFoWrongDescriptor) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const auto descriptor = sb::di::ServiceDescriber::describeAlias(); + + EXPECT_THROW(creator.create(descriptor), sb::di::InjectorException); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldFailForCircularDependency) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + EXPECT_CALL(mock.getMock(), tryGetInstance(sb::di::TypeId{typeid(CircularDependencyA)})) + .WillOnce(testing::Invoke([&](sb::di::TypeId typeId) { + const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); + creator.create(descriptor); + return nullptr; + })); + + EXPECT_CALL(mock.getMock(), tryGetInstance(sb::di::TypeId{typeid(CircularDependencyB)})) + .WillOnce(testing::Invoke([&](sb::di::TypeId typeId) { + const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); + creator.create(descriptor); + return nullptr; + })); + + const auto descriptor = sb::di::ServiceDescriber::describeSingleton(); + + EXPECT_THROW(creator.create(descriptor), sb::di::CircularDependencyException); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateInstance) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const auto instance = creator.create(sb::di::ServiceDescriber::describeSingleton()); + + EXPECT_TRUE(instance); + EXPECT_TRUE(instance.isValid()); + EXPECT_TRUE(instance.getAs()); + EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateInheritedInstance) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const auto instance = + creator.create(sb::di::ServiceDescriber::describeSingleton()); + + EXPECT_TRUE(instance); + EXPECT_TRUE(instance.isValid()); + EXPECT_TRUE(instance.getAs()); + EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateAllInstances) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const sb::di::details::ServiceDescriptorList descriptors{sb::di::ServiceDescriber::describeSingleton()}; + const auto instances = creator.createAll(descriptors); + + EXPECT_EQ(instances.size(), 1); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateAllInheritedInstances) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeSingleton()}; + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + + const auto instances = creator.createAll(descriptors); + + EXPECT_EQ(instances.size(), 3); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); + EXPECT_TRUE(instances[1].isValid()); + EXPECT_TRUE(instances[1].getAs()); + EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); + EXPECT_TRUE(instances[2].isValid()); + EXPECT_TRUE(instances[2].getAs()); + EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateRestInheritedInstances) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeSingleton()}; + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + + sb::di::details::ServiceInstanceList instances{ + sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, false)}}; + creator.createRest(descriptors, instances); + + EXPECT_EQ(instances.size(), 3); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); + EXPECT_TRUE(instances[1].isValid()); + EXPECT_TRUE(instances[1].getAs()); + EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); + EXPECT_TRUE(instances[2].isValid()); + EXPECT_TRUE(instances[2].getAs()); + EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateInstanceInPlace) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const auto instance = creator.createInPlace(sb::di::ServiceDescriber::describeSingleton()); + + EXPECT_TRUE(instance); + EXPECT_TRUE(instance.isValid()); + EXPECT_TRUE(instance.getAs()); + EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestClass1)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateInheritedInstanceInPlace) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const auto instance = + creator.createInPlace(sb::di::ServiceDescriber::describeSingleton()); + + EXPECT_TRUE(instance); + EXPECT_TRUE(instance.isValid()); + EXPECT_TRUE(instance.getAs()); + EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateAllInstancesInPlace) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const sb::di::details::ServiceDescriptorList descriptors{sb::di::ServiceDescriber::describeSingleton()}; + const auto instances = creator.createAllInPlace(descriptors); + + EXPECT_EQ(instances.size(), 1); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestClass1)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateAllInheritedInstancesInPlace) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeSingleton()}; + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + const auto instances = creator.createAllInPlace(descriptors); + + EXPECT_EQ(instances.size(), 3); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); + EXPECT_TRUE(instances[1].isValid()); + EXPECT_TRUE(instances[1].getAs()); + EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); + EXPECT_TRUE(instances[2].isValid()); + EXPECT_TRUE(instances[2].getAs()); + EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateRestInheritedInstancesInPlace) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeSingleton()}; + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + + sb::di::details::ServiceInstanceList instances{ + sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, true)}}; + creator.createRestInPlace(descriptors, instances); + + EXPECT_EQ(instances.size(), 3); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass3)); + EXPECT_TRUE(instances[1].isValid()); + EXPECT_TRUE(instances[1].getAs()); + EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); + EXPECT_TRUE(instances[2].isValid()); + EXPECT_TRUE(instances[2].getAs()); + EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); +} diff --git a/Tests/Unit/ServiceCollectionTest.cpp b/Tests/Unit/ServiceCollectionTest.cpp index fd0c4e6..60e8787 100644 --- a/Tests/Unit/ServiceCollectionTest.cpp +++ b/Tests/Unit/ServiceCollectionTest.cpp @@ -133,8 +133,6 @@ TEST_F(ServiceCollectionTest, ShouldGetWithIndexOperator) EXPECT_EQ(four.getLifeTime(), sb::di::ServiceLifeTime::scoped()); EXPECT_EQ(four.getServiceTypeId(), typeid(TestInheritClass1)); EXPECT_EQ(four.getImplementationTypeId(), typeid(TestInheritClass5)); - - EXPECT_NO_THROW(services[10]); } TEST_F(ServiceCollectionTest, ShouldGetSize) From 68f374ac0a270a2b1bc6993447b5b80da0282045 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Wed, 24 Apr 2024 20:05:29 +0200 Subject: [PATCH 14/19] update creators code --- .../Core/Impl/ServiceAliasesCreator.hpp | 28 +++----- .../Core/Impl/ServiceInstanceProvider.hpp | 32 ++++----- .../Core/Impl/ServiceInstancesCreator.hpp | 57 +++++----------- .../DI/Details/Core/ServiceAliasesCreator.hpp | 31 +++------ .../Details/Core/ServiceInstanceProvider.hpp | 5 +- .../Details/Core/ServiceInstancesCreator.hpp | 9 +-- Tests/Unit/Core/ServiceAliasesCreatorTest.cpp | 68 +++++++++---------- .../Unit/Core/ServiceInstancesCreatorTest.cpp | 35 +++++----- 8 files changed, 104 insertions(+), 161 deletions(-) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp index 0e0fac6..c46d172 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp @@ -26,31 +26,19 @@ namespace sb::di::details } INLINE void ServiceAliasesCreator::tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, - const OneOrList *originals) const + const OneOrList *originals, + const size_t skipLast) const { if (originals) { - instances.reserve(instances.size() + originals->size()); - originals->forEach([&](const ServiceInstance &instance) { instances.add(create(descriptor, instance)); }); - } - } - - INLINE void ServiceAliasesCreator::tryCreateRest(ServiceInstanceList &instances, - const ServiceDescriptor &descriptor, - const OneOrList *originals, - ServiceInstance &&first) const - { - if (originals) - { - const auto size = originals->size(); - instances.reserve(instances.size() + size); - originals->forEach([&](const ServiceInstance &instance, const std::size_t index) { - if (index < size - 1) // skip last + const auto take = originals->size() - skipLast; + instances.reserve(instances.size() + take); + originals->forEach([&](const ServiceInstance &instance, const size_t index) { + if (index < take) { instances.add(create(descriptor, instance)); } }); - instances.add(std::move(first)); } } @@ -73,9 +61,9 @@ namespace sb::di::details { RequireDescriptor::alias(descriptor); RequireInstance::valid(original); - auto implementationType = descriptor.getImplementationTypeId(); - auto implementation = std::make_unique(original.getAs(), implementationType); + auto implementation = + std::make_unique(original.getAs(), descriptor.getImplementationTypeId()); return ServiceInstance{std::move(implementation), descriptor.getCastOffset()}; } } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index 225e9b0..e536a7a 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -70,7 +70,9 @@ namespace sb::di::details { if (const auto descriptors = findDescriptors(id)) { - createRestInstances(*descriptors, *instances); + auto newInstances = tryCreateInstances(*descriptors, instances->size()); + newInstances.add(std::move(*instances)); + *instances = std::move(newInstances); instances->seal(); } } @@ -183,31 +185,21 @@ namespace sb::di::details return selectCreator(descriptor).createInPlace(descriptor); } - INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateInstances(const ServiceDescriptorList &descriptors) + INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateInstances(const ServiceDescriptorList &descriptors, + const size_t skipLast) { const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) { - return getAliasesCreator().tryCreateAll(descriptors, [this](const ServiceDescriptor &original) { - return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()}); - }); - } - RequireDescriptor::nonTransient(descriptor); - return selectCreator(descriptor).createAllInPlace(descriptors); - } - - INLINE void ServiceInstanceProvider::createRestInstances(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances) - { - const auto &descriptor = descriptors.last(); - if (descriptor.isAlias()) - { - return getAliasesCreator().tryCreateRest(descriptors, instances, [this](const ServiceDescriptor &original) { - return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()}); - }); + return getAliasesCreator().tryCreateAll( + descriptors, + [this](const ServiceDescriptor &original) { + return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()}); + }, + skipLast); } RequireDescriptor::nonTransient(descriptor); - selectCreator(descriptor).createRestInPlace(descriptors, instances); + return selectCreator(descriptor).createAllInPlace(descriptors, skipLast); } INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransientInstance(const ServiceDescriptor &descriptor) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp index 45f8e11..cda5c58 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp @@ -17,15 +17,10 @@ namespace sb::di::details return create(descriptor, false); } - INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors) - { - return createAll(descriptors, false); - } - - INLINE void ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances) + INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors, + const size_t skipLast) { - return createRest(descriptors, instances, false); + return createAll(descriptors, false, skipLast); } INLINE ServiceInstance ServiceInstancesCreator::createInPlace(const ServiceDescriptor &descriptor) @@ -33,45 +28,27 @@ namespace sb::di::details return create(descriptor, true); } - INLINE ServiceInstanceList ServiceInstancesCreator::createAllInPlace(const ServiceDescriptorList &descriptors) - { - return createAll(descriptors, true); - } - - INLINE void ServiceInstancesCreator::createRestInPlace(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances) + INLINE ServiceInstanceList ServiceInstancesCreator::createAllInPlace(const ServiceDescriptorList &descriptors, + const size_t skipLast) { - return createRest(descriptors, instances, true); + return createAll(descriptors, true, skipLast); } INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors, - const bool inPlaceRequest) + const bool inPlaceRequest, const size_t skipLast) { ServiceInstanceList instances; - instances.reserve(descriptors.size()); - descriptors.forEach( - [&](const ServiceDescriptor &descriptor) { instances.add(create(descriptor, inPlaceRequest)); }); + const auto take = descriptors.size() - skipLast; + instances.reserve(take); + descriptors.forEach([&](const ServiceDescriptor &descriptor, const size_t index) { + if (index < take) + { + instances.add(create(descriptor, inPlaceRequest)); + } + }); return instances; } - INLINE void ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors, - ServiceInstanceList &instances, const bool inPlaceRequest) - { - if (const auto size = descriptors.size(); size > 1) - { - instances.reserve(size); - auto first = create(descriptors.first(), inPlaceRequest); - descriptors.forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) { - if (index && index < size - 1) // skip first and last - { - instances.add(create(descriptor, inPlaceRequest)); - } - }); - instances.add(std::move(first)); - std::swap(instances.first(), instances.last()); - } - } - INLINE ServiceInstance ServiceInstancesCreator::create(const ServiceDescriptor &descriptor, const bool inPlaceRequest) { @@ -80,7 +57,7 @@ namespace sb::di::details const auto &factory = *Require::notNullAndGet(descriptor.getImplementationFactory()); auto _ = _circularDependencyGuard(descriptor.getImplementationTypeId()); - auto implementation = factory.createInstance(provider, inPlaceRequest); - return RequireInstance::validAndGet(ServiceInstance{std::move(implementation), descriptor.getCastOffset()}); + return RequireInstance::validAndGet( + ServiceInstance{factory.createInstance(provider, inPlaceRequest), descriptor.getCastOffset()}); } } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp index 93984d2..83cdc6a 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp @@ -13,27 +13,16 @@ namespace sb::di::details ServiceInstance tryCreate(const ServiceDescriptor &descriptor, const ServiceInstance *original) const; template - ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const + ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver, + const size_t skipLast = 0) const { ServiceInstanceList instances; - descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor) { - tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)); - }); - return instances; - } - - template - void tryCreateRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, - TResolver originalResolver) const - { - auto first = std::move(instances.first()); - instances.clear(); const auto size = descriptors.size(); - descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { - index < size - 1 - ? tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)) - : tryCreateRest(instances, aliasDescriptor, originalResolver(aliasDescriptor), std::move(first)); + descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const size_t index) { + const auto lastDescriptorSkip = index + 1 == size ? skipLast : 0; + tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor), lastDescriptorSkip); }); + return instances; } ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const; @@ -50,15 +39,13 @@ namespace sb::di::details private: void tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, - const OneOrList *originals) const; - - void tryCreateRest(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, - const OneOrList *originals, ServiceInstance &&first) const; + const OneOrList *originals, size_t skipLast = 0) const; void tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, OneOrList &&originals) const; - ServiceInstance create(const ServiceDescriptor &descriptor, const ServiceInstance &original) const; + [[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, + const ServiceInstance &original) const; }; } // namespace sb::di::details diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index f50177a..50bdd3f 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -133,12 +133,11 @@ namespace sb::di::details [[nodiscard]] const ServiceDescriptorList *findDescriptors(const ServiceId &id) const; [[nodiscard]] const ServiceDescriptorList *findTransientDescriptors(const ServiceId &id) const; - ServiceLifeTime getLifeTime(const ServiceDescriptor &descriptor) const; + [[nodiscard]] ServiceLifeTime getLifeTime(const ServiceDescriptor &descriptor) const; ServiceInstancesMap &getInstancesMap(ServiceLifeTime lifetime); ServiceInstance tryCreateInstance(const ServiceDescriptor &descriptor); - ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors); - void createRestInstances(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); + ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors, size_t skipLast = 0); ServiceInstance tryCreateTransientInstance(const ServiceDescriptor &descriptor); ServiceInstanceList tryCreateTransientInstances(const ServiceDescriptorList &descriptors); diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp index 9850018..bfd1831 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp @@ -17,17 +17,14 @@ namespace sb::di::details void setServiceProvider(ServiceProvider &serviceProvider) { _serviceProvider = &serviceProvider; } ServiceInstance create(const ServiceDescriptor &descriptor); - ServiceInstanceList createAll(const ServiceDescriptorList &descriptors); - void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); + ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, size_t skipLast = 0); ServiceInstance createInPlace(const ServiceDescriptor &descriptor); - ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors); - void createRestInPlace(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances); + ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors, size_t skipLast = 0); private: ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest); - ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest); - void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, bool inPlaceRequest); + ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest, size_t skipLast); }; } // namespace sb::di::details diff --git a/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp b/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp index 82c2855..ab42af2 100644 --- a/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp +++ b/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp @@ -152,37 +152,37 @@ TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForNull) EXPECT_TRUE(instances.empty()); } -TEST_F(ServiceAliasesCreatorTest, ShouldCreateRestAliases) -{ - sb::di::details::ServiceDescriptorList descriptors{ - sb::di::ServiceDescriber::describeAlias()}; - - constexpr sb::di::details::ServiceAliasesCreator creator; - - TestInheritClass3 test3; - TestInheritClass4 test4; - TestInheritClass5 test5; - sb::di::details::ServiceInstanceList externals{ - sb::di::ServiceInstance{std::make_unique>(&test3)}}; - externals.add( - sb::di::ServiceInstance{std::make_unique>(&test4)}); - externals.add( - sb::di::ServiceInstance{std::make_unique>(&test5)}); - - sb::di::details::ServiceInstanceList instances{ - sb::di::ServiceInstance{std::make_unique>(&test5)}}; - - creator.tryCreateRest(descriptors, instances, [&](const sb::di::ServiceDescriptor &) { return &externals; }); - - EXPECT_EQ(instances.size(), 3); - EXPECT_FALSE(instances.isSealed()); - EXPECT_TRUE(instances[0].isValid()); - EXPECT_TRUE(instances[0].getAs()); - EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); - EXPECT_TRUE(instances[1].isValid()); - EXPECT_TRUE(instances[1].getAs()); - EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); - EXPECT_TRUE(instances[2].isValid()); - EXPECT_TRUE(instances[2].getAs()); - EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -} +// TEST_F(ServiceAliasesCreatorTest, ShouldCreateRestAliases) +// { +// sb::di::details::ServiceDescriptorList descriptors{ +// sb::di::ServiceDescriber::describeAlias()}; +// +// constexpr sb::di::details::ServiceAliasesCreator creator; +// +// TestInheritClass3 test3; +// TestInheritClass4 test4; +// TestInheritClass5 test5; +// sb::di::details::ServiceInstanceList externals{ +// sb::di::ServiceInstance{std::make_unique>(&test3)}}; +// externals.add( +// sb::di::ServiceInstance{std::make_unique>(&test4)}); +// externals.add( +// sb::di::ServiceInstance{std::make_unique>(&test5)}); +// +// sb::di::details::ServiceInstanceList instances{ +// sb::di::ServiceInstance{std::make_unique>(&test5)}}; +// +// creator.tryCreateRest(descriptors, instances, [&](const sb::di::ServiceDescriptor &) { return &externals; }); +// +// EXPECT_EQ(instances.size(), 3); +// EXPECT_FALSE(instances.isSealed()); +// EXPECT_TRUE(instances[0].isValid()); +// EXPECT_TRUE(instances[0].getAs()); +// EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_TRUE(instances[1].isValid()); +// EXPECT_TRUE(instances[1].getAs()); +// EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// EXPECT_TRUE(instances[2].isValid()); +// EXPECT_TRUE(instances[2].getAs()); +// EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +// } diff --git a/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp b/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp index a474c7a..d43132c 100644 --- a/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp +++ b/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp @@ -152,7 +152,20 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateAllInheritedInstances) EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); } -TEST_F(ServiceInstancesCreatorTest, ShouldCreateRestInheritedInstances) +TEST_F(ServiceInstancesCreatorTest, ShouldCreateEmptyInstances) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + const sb::di::details::ServiceDescriptorList descriptors; + const auto instances = creator.createAll(descriptors); + + EXPECT_TRUE(instances.empty()); + EXPECT_FALSE(instances.isSealed()); +} + +TEST_F(ServiceInstancesCreatorTest, ShouldCreateSkippedInheritedInstances) { ServiceProviderMock mock; sb::di::details::ServiceInstancesCreator creator; @@ -163,11 +176,9 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateRestInheritedInstances) descriptors.add(sb::di::ServiceDescriber::describeSingleton()); descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - sb::di::details::ServiceInstanceList instances{ - sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, false)}}; - creator.createRest(descriptors, instances); + auto instances = creator.createAll(descriptors, 1); - EXPECT_EQ(instances.size(), 3); + EXPECT_EQ(instances.size(), 2); EXPECT_FALSE(instances.isSealed()); EXPECT_TRUE(instances[0].isValid()); EXPECT_TRUE(instances[0].getAs()); @@ -175,9 +186,6 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateRestInheritedInstances) EXPECT_TRUE(instances[1].isValid()); EXPECT_TRUE(instances[1].getAs()); EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); - EXPECT_TRUE(instances[2].isValid()); - EXPECT_TRUE(instances[2].getAs()); - EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); } TEST_F(ServiceInstancesCreatorTest, ShouldCreateInstanceInPlace) @@ -250,7 +258,7 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateAllInheritedInstancesInPlace) EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); } -TEST_F(ServiceInstancesCreatorTest, ShouldCreateRestInheritedInstancesInPlace) +TEST_F(ServiceInstancesCreatorTest, ShouldCreateSkippedInheritedInstancesInPlace) { ServiceProviderMock mock; sb::di::details::ServiceInstancesCreator creator; @@ -261,11 +269,9 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateRestInheritedInstancesInPlace) descriptors.add(sb::di::ServiceDescriber::describeSingleton()); descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - sb::di::details::ServiceInstanceList instances{ - sb::di::ServiceInstance{descriptors.last().getImplementationFactory()->createInstance(mock, true)}}; - creator.createRestInPlace(descriptors, instances); + auto instances = creator.createAll(descriptors, 1); - EXPECT_EQ(instances.size(), 3); + EXPECT_EQ(instances.size(), 2); EXPECT_FALSE(instances.isSealed()); EXPECT_TRUE(instances[0].isValid()); EXPECT_TRUE(instances[0].getAs()); @@ -273,7 +279,4 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateRestInheritedInstancesInPlace) EXPECT_TRUE(instances[1].isValid()); EXPECT_TRUE(instances[1].getAs()); EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); - EXPECT_TRUE(instances[2].isValid()); - EXPECT_TRUE(instances[2].getAs()); - EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass4)); } From 749704f9b4a3c2d2dd730f0dee4b94fd5eaa344a Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Wed, 24 Apr 2024 23:19:53 +0200 Subject: [PATCH 15/19] add break to foreach --- .../Core/Impl/ServiceAliasesCreator.hpp | 15 ++++----- .../Core/Impl/ServiceInstanceProvider.hpp | 2 +- .../Core/Impl/ServiceInstancesCreator.hpp | 19 ++++++----- .../DI/Details/Core/ServiceAliasesCreator.hpp | 14 ++++---- .../Details/Core/ServiceInstanceProvider.hpp | 2 +- .../Details/Core/ServiceInstancesCreator.hpp | 7 ++-- Include/SevenBit/DI/OneOrList.hpp | 32 +++++++++++++------ 7 files changed, 51 insertions(+), 40 deletions(-) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp index c46d172..f031015 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp @@ -27,17 +27,16 @@ namespace sb::di::details INLINE void ServiceAliasesCreator::tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, const OneOrList *originals, - const size_t skipLast) const + const std::size_t skipLast) const { if (originals) { - const auto take = originals->size() - skipLast; - instances.reserve(instances.size() + take); - originals->forEach([&](const ServiceInstance &instance, const size_t index) { - if (index < take) - { - instances.add(create(descriptor, instance)); - } + const auto size = originals->size(); + instances.reserve(size); + auto take = size - skipLast; + originals->forEach([&](const ServiceInstance &instance) { + instances.add(create(descriptor, instance)); + return --take; }); } } diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index e536a7a..c2f9508 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -186,7 +186,7 @@ namespace sb::di::details } INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateInstances(const ServiceDescriptorList &descriptors, - const size_t skipLast) + const std::size_t skipLast) { const auto &descriptor = descriptors.last(); if (descriptor.isAlias()) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp index cda5c58..d7eca02 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp @@ -18,7 +18,7 @@ namespace sb::di::details } INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors, - const size_t skipLast) + const std::size_t skipLast) { return createAll(descriptors, false, skipLast); } @@ -29,22 +29,21 @@ namespace sb::di::details } INLINE ServiceInstanceList ServiceInstancesCreator::createAllInPlace(const ServiceDescriptorList &descriptors, - const size_t skipLast) + const std::size_t skipLast) { return createAll(descriptors, true, skipLast); } INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors, - const bool inPlaceRequest, const size_t skipLast) + const bool inPlaceRequest, const std::size_t skipLast) { ServiceInstanceList instances; - const auto take = descriptors.size() - skipLast; - instances.reserve(take); - descriptors.forEach([&](const ServiceDescriptor &descriptor, const size_t index) { - if (index < take) - { - instances.add(create(descriptor, inPlaceRequest)); - } + const auto size = descriptors.size(); + instances.reserve(size); + auto take = size - skipLast; + descriptors.forEach([&](const ServiceDescriptor &descriptor) { + instances.add(create(descriptor, inPlaceRequest)); + return --take; }); return instances; } diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp index 83cdc6a..ff4828d 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp @@ -13,14 +13,14 @@ namespace sb::di::details ServiceInstance tryCreate(const ServiceDescriptor &descriptor, const ServiceInstance *original) const; template - ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver, - const size_t skipLast = 0) const + ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalsResolver, + const std::size_t skipLast = 0) const { ServiceInstanceList instances; const auto size = descriptors.size(); - descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const size_t index) { + descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { const auto lastDescriptorSkip = index + 1 == size ? skipLast : 0; - tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor), lastDescriptorSkip); + tryCreateAll(instances, aliasDescriptor, originalsResolver(aliasDescriptor), lastDescriptorSkip); }); return instances; } @@ -28,18 +28,18 @@ namespace sb::di::details ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const; template - ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const + ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalsResolver) const { ServiceInstanceList instances; descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor) { - tryMapAll(instances, aliasDescriptor, originalResolver(aliasDescriptor)); + tryMapAll(instances, aliasDescriptor, originalsResolver(aliasDescriptor)); }); return instances; } private: void tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, - const OneOrList *originals, size_t skipLast = 0) const; + const OneOrList *originals, std::size_t skipLast = 0) const; void tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor, OneOrList &&originals) const; diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index 50bdd3f..ff971b3 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -137,7 +137,7 @@ namespace sb::di::details ServiceInstancesMap &getInstancesMap(ServiceLifeTime lifetime); ServiceInstance tryCreateInstance(const ServiceDescriptor &descriptor); - ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors, size_t skipLast = 0); + ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors, std::size_t skipLast = 0); ServiceInstance tryCreateTransientInstance(const ServiceDescriptor &descriptor); ServiceInstanceList tryCreateTransientInstances(const ServiceDescriptorList &descriptors); diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp index bfd1831..05aefd2 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp @@ -17,14 +17,15 @@ namespace sb::di::details void setServiceProvider(ServiceProvider &serviceProvider) { _serviceProvider = &serviceProvider; } ServiceInstance create(const ServiceDescriptor &descriptor); - ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, size_t skipLast = 0); + ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, std::size_t skipLast = 0); ServiceInstance createInPlace(const ServiceDescriptor &descriptor); - ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors, size_t skipLast = 0); + ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors, std::size_t skipLast = 0); private: ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest); - ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest, size_t skipLast); + ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest, + std::size_t skipLast); }; } // namespace sb::di::details diff --git a/Include/SevenBit/DI/OneOrList.hpp b/Include/SevenBit/DI/OneOrList.hpp index 42f5200..de4f7e6 100644 --- a/Include/SevenBit/DI/OneOrList.hpp +++ b/Include/SevenBit/DI/OneOrList.hpp @@ -176,11 +176,7 @@ namespace sb::di } else if (auto list = tryGetAsList()) { - std::size_t index = 0; - for (auto &instance : *list) - { - callFcn(fcn, instance, index++); - } + listForEach(*list, fcn); } } @@ -192,11 +188,7 @@ namespace sb::di } else if (auto list = tryGetAsList()) { - std::size_t index = 0; - for (const auto &instance : *list) - { - callFcn(fcn, instance, index++); - } + listForEach(*list, fcn); } } @@ -234,6 +226,26 @@ namespace sb::di } } + template static void listForEach(TList &list, TFunc &fcn) + { + std::size_t index = 0; + for (auto &instance : list) + { + using Ret = decltype(callFcn(fcn, instance, 0)); + if constexpr (std::is_integral_v) + { + if (!callFcn(fcn, instance, index++)) + { + break; + } + } + else + { + callFcn(fcn, instance, index++); + } + } + } + template static auto callFcn(TFunc &fcn, TItem &item, std::size_t index) { if constexpr (std::is_invocable_v) From 4fa8eb66904df804888c7fecdaab8c8d26794824 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Thu, 25 Apr 2024 18:03:44 +0200 Subject: [PATCH 16/19] update creators tests and change include brackets --- Include/SevenBit/DI.hpp | 6 +- .../Containers/Impl/ServiceDescriptorList.hpp | 6 +- .../Containers/Impl/ServiceDescriptorsMap.hpp | 6 +- .../Containers/Impl/ServiceInstancesMap.hpp | 4 +- .../Containers/ServiceDescriptorList.hpp | 12 +-- .../Containers/ServiceDescriptorsMap.hpp | 10 +- .../Containers/ServiceInstanceList.hpp | 6 +- .../Containers/ServiceInstancesMap.hpp | 8 +- .../Core/IServiceInstanceProviderRoot.hpp | 8 +- .../Core/Impl/ServiceAliasesCreator.hpp | 22 +++-- .../Core/Impl/ServiceInstanceProvider.hpp | 18 ++-- .../Core/Impl/ServiceInstanceProviderRoot.hpp | 4 +- .../Core/Impl/ServiceInstancesCreator.hpp | 20 ++-- .../DI/Details/Core/ServiceAliasesCreator.hpp | 9 +- .../Details/Core/ServiceInstanceProvider.hpp | 18 ++-- .../Core/ServiceInstanceProviderRoot.hpp | 8 +- .../Details/Core/ServiceInstancesCreator.hpp | 10 +- .../Factories/ExternalServiceFactory.hpp | 6 +- .../DI/Details/Factories/ServiceFactory.hpp | 10 +- .../Details/Factories/ServiceFcnFactory.hpp | 12 +-- .../Helpers/CircularDependencyGuard.hpp | 8 +- .../DI/Details/Helpers/CtorInjector.hpp | 8 +- .../DI/Details/Helpers/FunctorInjector.hpp | 4 +- .../Helpers/Impl/CircularDependencyGuard.hpp | 4 +- .../DI/Details/Helpers/Impl/ScopedGuard.hpp | 6 +- .../DI/Details/Helpers/ScopedGuard.hpp | 6 +- .../Helpers/ServiceCtorArgExtractor.hpp | 6 +- .../DI/Details/Helpers/ServiceGetter.hpp | 6 +- .../SevenBit/DI/Details/Models/ServiceId.hpp | 4 +- .../DI/Details/Services/AliasService.hpp | 6 +- .../DI/Details/Services/ExternalService.hpp | 6 +- .../DI/Details/Services/InPlaceService.hpp | 6 +- .../DI/Details/Services/UniquePtrService.hpp | 4 +- Include/SevenBit/DI/Details/Utils/Assert.hpp | 4 +- Include/SevenBit/DI/Details/Utils/Cast.hpp | 2 +- Include/SevenBit/DI/Details/Utils/Check.hpp | 2 +- .../SevenBit/DI/Details/Utils/Container.hpp | 2 +- .../DI/Details/Utils/CtorParamsNumber.hpp | 4 +- .../Details/Utils/Impl/RequireDescriptor.hpp | 4 +- .../DI/Details/Utils/Impl/RequireInstance.hpp | 6 +- Include/SevenBit/DI/Details/Utils/Meta.hpp | 2 +- Include/SevenBit/DI/Details/Utils/Require.hpp | 6 +- .../DI/Details/Utils/RequireDescriptor.hpp | 8 +- .../DI/Details/Utils/RequireInstance.hpp | 8 +- Include/SevenBit/DI/Exceptions.hpp | 6 +- Include/SevenBit/DI/Export.hpp | 2 +- Include/SevenBit/DI/IServiceFactory.hpp | 4 +- Include/SevenBit/DI/IServiceInstance.hpp | 4 +- .../SevenBit/DI/IServiceInstanceProvider.hpp | 8 +- Include/SevenBit/DI/Impl/Exceptions.hpp | 4 +- .../SevenBit/DI/Impl/ServiceCollection.hpp | 6 +- Include/SevenBit/DI/LibraryConfig.hpp | 4 +- Include/SevenBit/DI/OneOrList.hpp | 38 +++----- Include/SevenBit/DI/ServiceCollection.hpp | 14 +-- Include/SevenBit/DI/ServiceDescriber.hpp | 16 ++-- Include/SevenBit/DI/ServiceDescriptor.hpp | 8 +- Include/SevenBit/DI/ServiceInstance.hpp | 6 +- Include/SevenBit/DI/ServiceLifeTime.hpp | 4 +- Include/SevenBit/DI/ServiceLifeTimes.hpp | 4 +- Include/SevenBit/DI/ServiceProvider.hpp | 10 +- .../SevenBit/DI/ServiceProviderOptions.hpp | 2 +- Include/SevenBit/DI/TypeId.hpp | 2 +- Include/SevenBit/DI/Utils/GlobalServices.hpp | 4 +- Include/SevenBit/DI/Utils/Injected.hpp | 6 +- Include/SevenBit/DI/Utils/Register.hpp | 4 +- .../SevenBit/DI/Utils/ServiceExtractor.hpp | 6 +- SingleHeader/SevenBitDI.hpp.in | 2 +- Tests/Integration/AliasTest.cpp | 91 +++++++++++++++++++ Tests/Unit/Core/ServiceAliasesCreatorTest.cpp | 90 ++++++++++-------- .../Unit/Core/ServiceInstancesCreatorTest.cpp | 21 ++++- Tests/Unit/OneOrListTest.cpp | 21 ++++- 71 files changed, 424 insertions(+), 288 deletions(-) diff --git a/Include/SevenBit/DI.hpp b/Include/SevenBit/DI.hpp index f548dcf..15c424d 100644 --- a/Include/SevenBit/DI.hpp +++ b/Include/SevenBit/DI.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/ServiceCollection.hpp" +#include "SevenBit/DI/Utils/Injected.hpp" diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp index 51c5255..5788567 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" +#include "SevenBit/DI/Exceptions.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp index 35556e2..2ad5b5b 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp" +#include "SevenBit/DI/Exceptions.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp index cc780c3..df48a37 100644 --- a/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp +++ b/Include/SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp index 5fb3f1d..c9235b8 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp @@ -1,11 +1,11 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include +#include "SevenBit/DI/OneOrList.hpp" +#include "SevenBit/DI/ServiceDescriptor.hpp" +#include "SevenBit/DI/ServiceLifeTime.hpp" +#include "SevenBit/DI/TypeId.hpp" namespace sb::di::details { @@ -40,5 +40,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Containers/Impl/ServiceDescriptorList.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp b/Include/SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp index 66136f4..74c5eba 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp @@ -4,11 +4,11 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include +#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" +#include "SevenBit/DI/Details/Models/ServiceId.hpp" +#include "SevenBit/DI/ServiceDescriptor.hpp" namespace sb::di::details { @@ -54,5 +54,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Containers/Impl/ServiceDescriptorsMap.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp index b1dd1f4..61a48e6 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstanceList.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/OneOrList.hpp" +#include "SevenBit/DI/ServiceInstance.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp b/Include/SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp index 40e5070..c764f2b 100644 --- a/Include/SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp +++ b/Include/SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp @@ -4,10 +4,10 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" +#include "SevenBit/DI/Details/Models/ServiceId.hpp" namespace sb::di::details { @@ -46,5 +46,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Containers/Impl/ServiceInstancesMap.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp index 999f15b..2005116 100644 --- a/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp @@ -1,10 +1,10 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include +#include "SevenBit/DI/Details/Containers/ServiceDescriptorsMap.hpp" +#include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" +#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp index f031015..53c6287 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp @@ -3,12 +3,12 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include +#include "SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp" +#include "SevenBit/DI/Details/Services/AliasService.hpp" +#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" +#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" namespace sb::di::details { @@ -32,11 +32,13 @@ namespace sb::di::details if (originals) { const auto size = originals->size(); + const auto take = skipLast <= size ? size - skipLast : 0; instances.reserve(size); - auto take = size - skipLast; - originals->forEach([&](const ServiceInstance &instance) { - instances.add(create(descriptor, instance)); - return --take; + originals->forEach([&](const ServiceInstance &instance, const std::size_t index) { + if (index < take) + { + instances.add(create(descriptor, instance)); + } }); } } @@ -51,7 +53,7 @@ namespace sb::di::details originals.forEach( [&](ServiceInstance &instance) { instance.addCastOffset(descriptor.getCastOffset()); }); } - instances.add(std::move(originals)); + instances.addList(std::move(originals)); } } diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp index c2f9508..9d39b3c 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp @@ -1,14 +1,14 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include -#include -#include -#include +#include "SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp" +#include "SevenBit/DI/Details/Services/ExternalService.hpp" +#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" +#include "SevenBit/DI/Exceptions.hpp" +#include "SevenBit/DI/ServiceInstance.hpp" +#include "SevenBit/DI/ServiceLifeTimes.hpp" +#include "SevenBit/DI/ServiceProvider.hpp" namespace sb::di::details { @@ -71,7 +71,7 @@ namespace sb::di::details if (const auto descriptors = findDescriptors(id)) { auto newInstances = tryCreateInstances(*descriptors, instances->size()); - newInstances.add(std::move(*instances)); + newInstances.addList(std::move(*instances)); *instances = std::move(newInstances); instances->seal(); } diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp index 7762f19..f684349 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp index d7eca02..ad91a57 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp @@ -3,12 +3,12 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include +#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" +#include "SevenBit/DI/Details/Utils/Require.hpp" +#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" +#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" namespace sb::di::details { @@ -39,11 +39,13 @@ namespace sb::di::details { ServiceInstanceList instances; const auto size = descriptors.size(); + const auto take = skipLast <= size ? size - skipLast : 0; instances.reserve(size); - auto take = size - skipLast; - descriptors.forEach([&](const ServiceDescriptor &descriptor) { - instances.add(create(descriptor, inPlaceRequest)); - return --take; + descriptors.forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) { + if (index < take) + { + instances.add(create(descriptor, inPlaceRequest)); + } }); return instances; } diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp index ff4828d..a7409ae 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" +#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" namespace sb::di::details { @@ -18,6 +18,7 @@ namespace sb::di::details { ServiceInstanceList instances; const auto size = descriptors.size(); + instances.reserve(size); descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { const auto lastDescriptorSkip = index + 1 == size ? skipLast : 0; tryCreateAll(instances, aliasDescriptor, originalsResolver(aliasDescriptor), lastDescriptorSkip); @@ -50,5 +51,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp index ff971b3..04ace73 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp @@ -3,15 +3,15 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include -#include -#include -#include +#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" +#include "SevenBit/DI/Details/Containers/ServiceInstancesMap.hpp" +#include "SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp" +#include "SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp" +#include "SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp" +#include "SevenBit/DI/IServiceInstanceProvider.hpp" +#include "SevenBit/DI/ServiceProviderOptions.hpp" namespace sb::di::details { @@ -149,5 +149,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp index 917961e..d51ac52 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Core/IServiceInstanceProviderRoot.hpp" +#include "SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp" namespace sb::di::details { @@ -43,5 +43,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Core/Impl/ServiceInstanceProviderRoot.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp index 05aefd2..fc2f1c2 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp @@ -1,10 +1,10 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include +#include "SevenBit/DI/Details/Containers/ServiceDescriptorList.hpp" +#include "SevenBit/DI/Details/Containers/ServiceInstanceList.hpp" +#include "SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp" namespace sb::di::details { @@ -30,5 +30,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp b/Include/SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp index 86997f5..541fe67 100644 --- a/Include/SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp +++ b/Include/SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Services/ExternalService.hpp" +#include "SevenBit/DI/IServiceFactory.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp b/Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp index c1069c0..a31f88b 100644 --- a/Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp +++ b/Include/SevenBit/DI/Details/Factories/ServiceFactory.hpp @@ -3,12 +3,12 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include +#include "SevenBit/DI/Details/Helpers/CtorInjector.hpp" +#include "SevenBit/DI/Details/Services/InPlaceService.hpp" +#include "SevenBit/DI/Details/Services/UniquePtrService.hpp" +#include "SevenBit/DI/IServiceFactory.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp b/Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp index aa8eff7..68ee336 100644 --- a/Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp +++ b/Include/SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp @@ -3,13 +3,13 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include -#include +#include "SevenBit/DI/Details/Helpers/FunctorInjector.hpp" +#include "SevenBit/DI/Details/Services/InPlaceService.hpp" +#include "SevenBit/DI/Details/Services/UniquePtrService.hpp" +#include "SevenBit/DI/Details/Utils/Meta.hpp" +#include "SevenBit/DI/IServiceFactory.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp b/Include/SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp index bd91122..55a9da0 100644 --- a/Include/SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp +++ b/Include/SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Helpers/ScopedGuard.hpp" +#include "SevenBit/DI/TypeId.hpp" namespace sb::di::details { @@ -21,5 +21,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp b/Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp index 976d3d1..20148b9 100644 --- a/Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp +++ b/Include/SevenBit/DI/Details/Helpers/CtorInjector.hpp @@ -2,11 +2,11 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include +#include "SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp" +#include "SevenBit/DI/Details/Utils/CtorParamsNumber.hpp" +#include "SevenBit/DI/ServiceProvider.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp b/Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp index c1388b1..fdb2b8d 100644 --- a/Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp +++ b/Include/SevenBit/DI/Details/Helpers/FunctorInjector.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Helpers/ServiceGetter.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp b/Include/SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp index f41c073..769e226 100644 --- a/Include/SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp +++ b/Include/SevenBit/DI/Details/Helpers/Impl/CircularDependencyGuard.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Helpers/CircularDependencyGuard.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp b/Include/SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp index ad95df2..77a0603 100644 --- a/Include/SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp +++ b/Include/SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Helpers/ScopedGuard.hpp" +#include "SevenBit/DI/Exceptions.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/ScopedGuard.hpp b/Include/SevenBit/DI/Details/Helpers/ScopedGuard.hpp index 7c2d760..190147a 100644 --- a/Include/SevenBit/DI/Details/Helpers/ScopedGuard.hpp +++ b/Include/SevenBit/DI/Details/Helpers/ScopedGuard.hpp @@ -2,9 +2,9 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/TypeId.hpp" namespace sb::di::details { @@ -22,5 +22,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Helpers/Impl/ScopedGuard.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp b/Include/SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp index 52091b0..fa93d27 100644 --- a/Include/SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp +++ b/Include/SevenBit/DI/Details/Helpers/ServiceCtorArgExtractor.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Helpers/ServiceGetter.hpp" +#include "SevenBit/DI/Details/Utils/Meta.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Helpers/ServiceGetter.hpp b/Include/SevenBit/DI/Details/Helpers/ServiceGetter.hpp index 7c0a951..dc4477b 100644 --- a/Include/SevenBit/DI/Details/Helpers/ServiceGetter.hpp +++ b/Include/SevenBit/DI/Details/Helpers/ServiceGetter.hpp @@ -3,10 +3,10 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Utils/Meta.hpp" +#include "SevenBit/DI/ServiceProvider.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Models/ServiceId.hpp b/Include/SevenBit/DI/Details/Models/ServiceId.hpp index 2153db4..1b7dc2a 100644 --- a/Include/SevenBit/DI/Details/Models/ServiceId.hpp +++ b/Include/SevenBit/DI/Details/Models/ServiceId.hpp @@ -5,9 +5,9 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/TypeId.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Services/AliasService.hpp b/Include/SevenBit/DI/Details/Services/AliasService.hpp index ce80192..54a21ea 100644 --- a/Include/SevenBit/DI/Details/Services/AliasService.hpp +++ b/Include/SevenBit/DI/Details/Services/AliasService.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Exceptions.hpp" +#include "SevenBit/DI/IServiceInstance.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Services/ExternalService.hpp b/Include/SevenBit/DI/Details/Services/ExternalService.hpp index 6472007..6edcc6a 100644 --- a/Include/SevenBit/DI/Details/Services/ExternalService.hpp +++ b/Include/SevenBit/DI/Details/Services/ExternalService.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Exceptions.hpp" +#include "SevenBit/DI/IServiceInstance.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Services/InPlaceService.hpp b/Include/SevenBit/DI/Details/Services/InPlaceService.hpp index 6060262..6ba7d7c 100644 --- a/Include/SevenBit/DI/Details/Services/InPlaceService.hpp +++ b/Include/SevenBit/DI/Details/Services/InPlaceService.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Exceptions.hpp" +#include "SevenBit/DI/IServiceInstance.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Services/UniquePtrService.hpp b/Include/SevenBit/DI/Details/Services/UniquePtrService.hpp index a516347..f5044a0 100644 --- a/Include/SevenBit/DI/Details/Services/UniquePtrService.hpp +++ b/Include/SevenBit/DI/Details/Services/UniquePtrService.hpp @@ -2,9 +2,9 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/IServiceInstance.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Assert.hpp b/Include/SevenBit/DI/Details/Utils/Assert.hpp index 52f1fcb..d4d2900 100644 --- a/Include/SevenBit/DI/Details/Utils/Assert.hpp +++ b/Include/SevenBit/DI/Details/Utils/Assert.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Utils/Meta.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Cast.hpp b/Include/SevenBit/DI/Details/Utils/Cast.hpp index 1334e10..b7a43ad 100644 --- a/Include/SevenBit/DI/Details/Utils/Cast.hpp +++ b/Include/SevenBit/DI/Details/Utils/Cast.hpp @@ -2,7 +2,7 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Check.hpp b/Include/SevenBit/DI/Details/Utils/Check.hpp index a14c078..b3eefda 100644 --- a/Include/SevenBit/DI/Details/Utils/Check.hpp +++ b/Include/SevenBit/DI/Details/Utils/Check.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Container.hpp b/Include/SevenBit/DI/Details/Utils/Container.hpp index 486d2fd..2b2ce55 100644 --- a/Include/SevenBit/DI/Details/Utils/Container.hpp +++ b/Include/SevenBit/DI/Details/Utils/Container.hpp @@ -2,7 +2,7 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/CtorParamsNumber.hpp b/Include/SevenBit/DI/Details/Utils/CtorParamsNumber.hpp index 60744e3..e07eeb5 100644 --- a/Include/SevenBit/DI/Details/Utils/CtorParamsNumber.hpp +++ b/Include/SevenBit/DI/Details/Utils/CtorParamsNumber.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Utils/Meta.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp b/Include/SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp index cac84ad..19cdde3 100644 --- a/Include/SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp +++ b/Include/SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Utils/RequireDescriptor.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp b/Include/SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp index 11bb303..9ec171a 100644 --- a/Include/SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp +++ b/Include/SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" +#include "SevenBit/DI/Details/Utils/Require.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Meta.hpp b/Include/SevenBit/DI/Details/Utils/Meta.hpp index e002656..ed81d5a 100644 --- a/Include/SevenBit/DI/Details/Utils/Meta.hpp +++ b/Include/SevenBit/DI/Details/Utils/Meta.hpp @@ -3,7 +3,7 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/Require.hpp b/Include/SevenBit/DI/Details/Utils/Require.hpp index 7a2bc27..1c3a529 100644 --- a/Include/SevenBit/DI/Details/Utils/Require.hpp +++ b/Include/SevenBit/DI/Details/Utils/Require.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Utils/Check.hpp" +#include "SevenBit/DI/Exceptions.hpp" namespace sb::di::details { diff --git a/Include/SevenBit/DI/Details/Utils/RequireDescriptor.hpp b/Include/SevenBit/DI/Details/Utils/RequireDescriptor.hpp index f668828..8ffdb90 100644 --- a/Include/SevenBit/DI/Details/Utils/RequireDescriptor.hpp +++ b/Include/SevenBit/DI/Details/Utils/RequireDescriptor.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/ServiceDescriptor.hpp" +#include "SevenBit/DI/ServiceInstance.hpp" namespace sb::di::details { @@ -18,5 +18,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Utils/Impl/RequireDescriptor.hpp" #endif diff --git a/Include/SevenBit/DI/Details/Utils/RequireInstance.hpp b/Include/SevenBit/DI/Details/Utils/RequireInstance.hpp index 9ceb12b..a44aa54 100644 --- a/Include/SevenBit/DI/Details/Utils/RequireInstance.hpp +++ b/Include/SevenBit/DI/Details/Utils/RequireInstance.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/ServiceDescriptor.hpp" +#include "SevenBit/DI/ServiceInstance.hpp" namespace sb::di::details { @@ -18,5 +18,5 @@ namespace sb::di::details } // namespace sb::di::details #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Details/Utils/Impl/RequireInstance.hpp" #endif diff --git a/Include/SevenBit/DI/Exceptions.hpp b/Include/SevenBit/DI/Exceptions.hpp index 7d0a77b..4d398ff 100644 --- a/Include/SevenBit/DI/Exceptions.hpp +++ b/Include/SevenBit/DI/Exceptions.hpp @@ -3,9 +3,9 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/TypeId.hpp" namespace sb::di { @@ -65,5 +65,5 @@ namespace sb::di } // namespace sb::di #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Impl/Exceptions.hpp" #endif diff --git a/Include/SevenBit/DI/Export.hpp b/Include/SevenBit/DI/Export.hpp index b3384f4..2a5948a 100644 --- a/Include/SevenBit/DI/Export.hpp +++ b/Include/SevenBit/DI/Export.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include "SevenBit/DI/CmakeDef.hpp" #ifdef _7BIT_DI_SHARED_LIB //!!! cmake when compiling shared lib sets _EXPORTS diff --git a/Include/SevenBit/DI/IServiceFactory.hpp b/Include/SevenBit/DI/IServiceFactory.hpp index 9c48f08..9d12263 100644 --- a/Include/SevenBit/DI/IServiceFactory.hpp +++ b/Include/SevenBit/DI/IServiceFactory.hpp @@ -2,9 +2,9 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/IServiceInstance.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/IServiceInstance.hpp b/Include/SevenBit/DI/IServiceInstance.hpp index 5a61a0f..eb70e84 100644 --- a/Include/SevenBit/DI/IServiceInstance.hpp +++ b/Include/SevenBit/DI/IServiceInstance.hpp @@ -2,9 +2,9 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/TypeId.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/IServiceInstanceProvider.hpp b/Include/SevenBit/DI/IServiceInstanceProvider.hpp index deef611..d9d5015 100644 --- a/Include/SevenBit/DI/IServiceInstanceProvider.hpp +++ b/Include/SevenBit/DI/IServiceInstanceProvider.hpp @@ -4,11 +4,11 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include +#include "SevenBit/DI/OneOrList.hpp" +#include "SevenBit/DI/ServiceInstance.hpp" +#include "SevenBit/DI/TypeId.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/Impl/Exceptions.hpp b/Include/SevenBit/DI/Impl/Exceptions.hpp index 5991fc1..0fbe748 100644 --- a/Include/SevenBit/DI/Impl/Exceptions.hpp +++ b/Include/SevenBit/DI/Impl/Exceptions.hpp @@ -2,9 +2,9 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Exceptions.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/Impl/ServiceCollection.hpp b/Include/SevenBit/DI/Impl/ServiceCollection.hpp index 125ccd3..45f60d2 100644 --- a/Include/SevenBit/DI/Impl/ServiceCollection.hpp +++ b/Include/SevenBit/DI/Impl/ServiceCollection.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Core/ServiceInstanceProviderRoot.hpp" +#include "SevenBit/DI/ServiceCollection.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/LibraryConfig.hpp b/Include/SevenBit/DI/LibraryConfig.hpp index 075a35c..ef35679 100644 --- a/Include/SevenBit/DI/LibraryConfig.hpp +++ b/Include/SevenBit/DI/LibraryConfig.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include "SevenBit/DI/CmakeDef.hpp" #ifndef _7BIT_DI_VERSION_MAJOR #define _7BIT_DI_VERSION_MAJOR 0 @@ -56,4 +56,4 @@ #define _7BIT_DI_CTOR_PARAMS_LIMIT 100 #endif -#include +#include "SevenBit/DI/Export.hpp" diff --git a/Include/SevenBit/DI/OneOrList.hpp b/Include/SevenBit/DI/OneOrList.hpp index de4f7e6..8293500 100644 --- a/Include/SevenBit/DI/OneOrList.hpp +++ b/Include/SevenBit/DI/OneOrList.hpp @@ -4,9 +4,9 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Utils/Meta.hpp" namespace sb::di { @@ -65,7 +65,7 @@ namespace sb::di } } - void add(OneOrList &&other) + void addList(OneOrList &&other) { if (auto list = other.tryGetAsList()) { @@ -176,7 +176,11 @@ namespace sb::di } else if (auto list = tryGetAsList()) { - listForEach(*list, fcn); + std::size_t index = 0; + for (auto &instance : *list) + { + callFcn(fcn, instance, index++); + } } } @@ -188,7 +192,11 @@ namespace sb::di } else if (auto list = tryGetAsList()) { - listForEach(*list, fcn); + std::size_t index = 0; + for (auto &instance : *list) + { + callFcn(fcn, instance, index++); + } } } @@ -226,26 +234,6 @@ namespace sb::di } } - template static void listForEach(TList &list, TFunc &fcn) - { - std::size_t index = 0; - for (auto &instance : list) - { - using Ret = decltype(callFcn(fcn, instance, 0)); - if constexpr (std::is_integral_v) - { - if (!callFcn(fcn, instance, index++)) - { - break; - } - } - else - { - callFcn(fcn, instance, index++); - } - } - } - template static auto callFcn(TFunc &fcn, TItem &item, std::size_t index) { if constexpr (std::is_invocable_v) diff --git a/Include/SevenBit/DI/ServiceCollection.hpp b/Include/SevenBit/DI/ServiceCollection.hpp index 746568e..502f5b8 100644 --- a/Include/SevenBit/DI/ServiceCollection.hpp +++ b/Include/SevenBit/DI/ServiceCollection.hpp @@ -5,13 +5,13 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include -#include +#include "SevenBit/DI/Details/Utils/Container.hpp" +#include "SevenBit/DI/ServiceDescriber.hpp" +#include "SevenBit/DI/ServiceLifeTimes.hpp" +#include "SevenBit/DI/ServiceProvider.hpp" +#include "SevenBit/DI/ServiceProviderOptions.hpp" namespace sb::di { @@ -1067,5 +1067,5 @@ namespace sb::di } // namespace sb::di #ifdef _7BIT_DI_ADD_IMPL -#include +#include "SevenBit/DI/Impl/ServiceCollection.hpp" #endif diff --git a/Include/SevenBit/DI/ServiceDescriber.hpp b/Include/SevenBit/DI/ServiceDescriber.hpp index 0462095..fd3dfb4 100644 --- a/Include/SevenBit/DI/ServiceDescriber.hpp +++ b/Include/SevenBit/DI/ServiceDescriber.hpp @@ -2,15 +2,15 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include -#include -#include -#include -#include +#include "SevenBit/DI/Details/Factories/ExternalServiceFactory.hpp" +#include "SevenBit/DI/Details/Factories/ServiceFactory.hpp" +#include "SevenBit/DI/Details/Factories/ServiceFcnFactory.hpp" +#include "SevenBit/DI/Details/Utils/Assert.hpp" +#include "SevenBit/DI/Details/Utils/Cast.hpp" +#include "SevenBit/DI/ServiceDescriptor.hpp" +#include "SevenBit/DI/ServiceLifeTimes.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceDescriptor.hpp b/Include/SevenBit/DI/ServiceDescriptor.hpp index f4d8dba..c9fc702 100644 --- a/Include/SevenBit/DI/ServiceDescriptor.hpp +++ b/Include/SevenBit/DI/ServiceDescriptor.hpp @@ -3,11 +3,11 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include +#include "SevenBit/DI/IServiceFactory.hpp" +#include "SevenBit/DI/ServiceLifeTime.hpp" +#include "SevenBit/DI/TypeId.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceInstance.hpp b/Include/SevenBit/DI/ServiceInstance.hpp index b5b238c..68115ab 100644 --- a/Include/SevenBit/DI/ServiceInstance.hpp +++ b/Include/SevenBit/DI/ServiceInstance.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Utils/Cast.hpp" +#include "SevenBit/DI/IServiceInstance.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceLifeTime.hpp b/Include/SevenBit/DI/ServiceLifeTime.hpp index 03b5de8..48d7b5c 100644 --- a/Include/SevenBit/DI/ServiceLifeTime.hpp +++ b/Include/SevenBit/DI/ServiceLifeTime.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Details/Utils/Require.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceLifeTimes.hpp b/Include/SevenBit/DI/ServiceLifeTimes.hpp index d801668..41e03dd 100644 --- a/Include/SevenBit/DI/ServiceLifeTimes.hpp +++ b/Include/SevenBit/DI/ServiceLifeTimes.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/ServiceLifeTime.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/ServiceProvider.hpp b/Include/SevenBit/DI/ServiceProvider.hpp index 176570f..83c8345 100644 --- a/Include/SevenBit/DI/ServiceProvider.hpp +++ b/Include/SevenBit/DI/ServiceProvider.hpp @@ -4,11 +4,11 @@ #include #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include -#include +#include "SevenBit/DI/Details/Utils/Require.hpp" +#include "SevenBit/DI/Details/Utils/RequireInstance.hpp" +#include "SevenBit/DI/IServiceInstanceProvider.hpp" namespace sb::di { @@ -372,7 +372,6 @@ namespace sb::di details::RequireInstance::valid(instance); return instance.moveOutAsUniquePtr(); }); - return {}; } /** @@ -398,7 +397,6 @@ namespace sb::di details::RequireInstance::valid(instance); return instance.moveOutAsUniquePtr(); }); - return {}; } }; } // namespace sb::di diff --git a/Include/SevenBit/DI/ServiceProviderOptions.hpp b/Include/SevenBit/DI/ServiceProviderOptions.hpp index 406190c..c4265d2 100644 --- a/Include/SevenBit/DI/ServiceProviderOptions.hpp +++ b/Include/SevenBit/DI/ServiceProviderOptions.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/TypeId.hpp b/Include/SevenBit/DI/TypeId.hpp index 0a87743..5fa7a9f 100644 --- a/Include/SevenBit/DI/TypeId.hpp +++ b/Include/SevenBit/DI/TypeId.hpp @@ -2,7 +2,7 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/Utils/GlobalServices.hpp b/Include/SevenBit/DI/Utils/GlobalServices.hpp index 780c237..38304b7 100644 --- a/Include/SevenBit/DI/Utils/GlobalServices.hpp +++ b/Include/SevenBit/DI/Utils/GlobalServices.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/ServiceCollection.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/Utils/Injected.hpp b/Include/SevenBit/DI/Utils/Injected.hpp index 4d00f92..ea3a0d2 100644 --- a/Include/SevenBit/DI/Utils/Injected.hpp +++ b/Include/SevenBit/DI/Utils/Injected.hpp @@ -1,9 +1,9 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Utils/Register.hpp" +#include "SevenBit/DI/Utils/ServiceExtractor.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/Utils/Register.hpp b/Include/SevenBit/DI/Utils/Register.hpp index 89b570e..9049966 100644 --- a/Include/SevenBit/DI/Utils/Register.hpp +++ b/Include/SevenBit/DI/Utils/Register.hpp @@ -1,8 +1,8 @@ #pragma once -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include +#include "SevenBit/DI/Utils/GlobalServices.hpp" namespace sb::di { diff --git a/Include/SevenBit/DI/Utils/ServiceExtractor.hpp b/Include/SevenBit/DI/Utils/ServiceExtractor.hpp index 4541715..eba0b53 100644 --- a/Include/SevenBit/DI/Utils/ServiceExtractor.hpp +++ b/Include/SevenBit/DI/Utils/ServiceExtractor.hpp @@ -2,10 +2,10 @@ #include -#include +#include "SevenBit/DI/LibraryConfig.hpp" -#include -#include +#include "SevenBit/DI/Details/Helpers/ServiceGetter.hpp" +#include "SevenBit/DI/Details/Utils/Meta.hpp" namespace sb::di { diff --git a/SingleHeader/SevenBitDI.hpp.in b/SingleHeader/SevenBitDI.hpp.in index 71f2535..aebcb49 100644 --- a/SingleHeader/SevenBitDI.hpp.in +++ b/SingleHeader/SevenBitDI.hpp.in @@ -2,4 +2,4 @@ #define _7BIT_DI_HEADER_ONLY_LIB -#include +#include "SevenBit/DI.hpp" diff --git a/Tests/Integration/AliasTest.cpp b/Tests/Integration/AliasTest.cpp index 7c1b1c3..dca1adf 100644 --- a/Tests/Integration/AliasTest.cpp +++ b/Tests/Integration/AliasTest.cpp @@ -230,6 +230,23 @@ TEST_F(AliasTest, ShouldGetMultipleServices) EXPECT_EQ(services[2], services[0]); } +TEST_F(AliasTest, ShouldGetMultipleSomeWrongServices) +{ + auto provider = sb::di::ServiceCollection{} + .addSingleton() + .addAlias() + .addAlias() + .addAlias() + .addAlias() + .buildServiceProvider(); + + const auto services = provider.getServices(); + + EXPECT_EQ(services.size(), 2); + EXPECT_EQ(services[0]->first(), 4); + EXPECT_EQ(services[1]->first(), 4); +} + TEST_F(AliasTest, ShoulNotGetServices) { auto provider = sb::di::ServiceCollection{} @@ -262,6 +279,23 @@ TEST_F(AliasTest, ShouldGetCastedServicesInOrder) EXPECT_EQ(services[1]->first(), 4); } +TEST_F(AliasTest, ShouldGetCastedMultipleServicesInOrder) +{ + auto provider = sb::di::ServiceCollection{} + .addSingleton() + .addSingleton() + .addAlias() + .addAlias() + .addAlias() + .buildServiceProvider(); + + const auto services = provider.getServices(); + + EXPECT_EQ(services.size(), 2); + EXPECT_EQ(services[0]->first(), 4); + EXPECT_EQ(services[1]->first(), 3); +} + TEST_F(AliasTest, ShouldGetServicesInOrderAfterNormalGet) { auto provider = sb::di::ServiceCollection{} @@ -271,12 +305,52 @@ TEST_F(AliasTest, ShouldGetServicesInOrderAfterNormalGet) .buildServiceProvider(); EXPECT_TRUE(provider.tryGetService()); + const auto services = provider.getServices(); + EXPECT_EQ(services.size(), 2); EXPECT_EQ(services[0]->first(), 3); EXPECT_EQ(services[1]->first(), 4); } +TEST_F(AliasTest, ShouldGetMultipleServicesInOrderAfterNormalGet) +{ + auto provider = sb::di::ServiceCollection{} + .addSingleton() + .addSingleton() + .addAlias() + .addAlias() + .addAlias() + .buildServiceProvider(); + + EXPECT_TRUE(provider.tryGetService()); + + const auto services = provider.getServices(); + + EXPECT_EQ(services.size(), 2); + EXPECT_EQ(services[0]->first(), 4); + EXPECT_EQ(services[1]->first(), 3); +} + +TEST_F(AliasTest, ShouldGetNotMultipleServicesInOrderAfterNormalGet) +{ + auto provider = sb::di::ServiceCollection{} + .addSingleton() + .addSingleton() + .addAlias() + .addAlias() + .addAlias() + .buildServiceProvider(); + + EXPECT_FALSE(provider.tryGetService()); + + const auto services = provider.getServices(); + + EXPECT_EQ(services.size(), 2); + EXPECT_EQ(services[0]->first(), 4); + EXPECT_EQ(services[1]->first(), 3); +} + TEST_F(AliasTest, ShouldTryCreateService) { auto provider = sb::di::ServiceCollection{} @@ -408,6 +482,23 @@ TEST_F(AliasTest, ShouldCreateMultipleServices) EXPECT_EQ(services[2]->first(), 4); } +TEST_F(AliasTest, ShouldCreateMultipleSomeWrongServices) +{ + auto provider = sb::di::ServiceCollection{} + .addTransient() + .addAlias() + .addAlias() + .addAlias() + .addAlias() + .buildServiceProvider(); + + const auto services = provider.createServices(); + + EXPECT_EQ(services.size(), 2); + EXPECT_EQ(services[0]->first(), 4); + EXPECT_EQ(services[1]->first(), 4); +} + TEST_F(AliasTest, ShoulNotCreateServices) { auto provider = sb::di::ServiceCollection{} diff --git a/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp b/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp index ab42af2..92a43c0 100644 --- a/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp +++ b/Tests/Unit/Core/ServiceAliasesCreatorTest.cpp @@ -1,7 +1,6 @@ #include #include -#include "../../Helpers/Classes/Basic.hpp" #include "../../Helpers/Classes/Inherit.hpp" #include "../../Helpers/Mocks/ServiceProviderMock.hpp" #include @@ -140,7 +139,7 @@ TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForEmpty) TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForNull) { - sb::di::details::ServiceDescriptorList descriptors{ + const sb::di::details::ServiceDescriptorList descriptors{ sb::di::ServiceDescriber::describeAlias()}; constexpr sb::di::details::ServiceAliasesCreator creator; @@ -152,37 +151,56 @@ TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForNull) EXPECT_TRUE(instances.empty()); } -// TEST_F(ServiceAliasesCreatorTest, ShouldCreateRestAliases) -// { -// sb::di::details::ServiceDescriptorList descriptors{ -// sb::di::ServiceDescriber::describeAlias()}; -// -// constexpr sb::di::details::ServiceAliasesCreator creator; -// -// TestInheritClass3 test3; -// TestInheritClass4 test4; -// TestInheritClass5 test5; -// sb::di::details::ServiceInstanceList externals{ -// sb::di::ServiceInstance{std::make_unique>(&test3)}}; -// externals.add( -// sb::di::ServiceInstance{std::make_unique>(&test4)}); -// externals.add( -// sb::di::ServiceInstance{std::make_unique>(&test5)}); -// -// sb::di::details::ServiceInstanceList instances{ -// sb::di::ServiceInstance{std::make_unique>(&test5)}}; -// -// creator.tryCreateRest(descriptors, instances, [&](const sb::di::ServiceDescriptor &) { return &externals; }); -// -// EXPECT_EQ(instances.size(), 3); -// EXPECT_FALSE(instances.isSealed()); -// EXPECT_TRUE(instances[0].isValid()); -// EXPECT_TRUE(instances[0].getAs()); -// EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// EXPECT_TRUE(instances[1].isValid()); -// EXPECT_TRUE(instances[1].getAs()); -// EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// EXPECT_TRUE(instances[2].isValid()); -// EXPECT_TRUE(instances[2].getAs()); -// EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); -// } +TEST_F(ServiceAliasesCreatorTest, ShouldCreateSkippedAliases) +{ + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeAlias()}; + + constexpr sb::di::details::ServiceAliasesCreator creator; + + TestInheritClass3 test3; + TestInheritClass4 test4; + TestInheritClass5 test5; + sb::di::details::ServiceInstanceList externals{ + sb::di::ServiceInstance{std::make_unique>(&test3)}}; + externals.add( + sb::di::ServiceInstance{std::make_unique>(&test4)}); + externals.add( + sb::di::ServiceInstance{std::make_unique>(&test5)}); + + const auto instances = + creator.tryCreateAll(descriptors, [&](const sb::di::ServiceDescriptor &) { return &externals; }, 1); + + EXPECT_EQ(instances.size(), 2); + EXPECT_FALSE(instances.isSealed()); + EXPECT_TRUE(instances[0].isValid()); + EXPECT_TRUE(instances[0].getAs()); + EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); + EXPECT_TRUE(instances[1].isValid()); + EXPECT_TRUE(instances[1].getAs()); + EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2)); +} + +TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateSkippedAliases) +{ + const sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeAlias()}; + + constexpr sb::di::details::ServiceAliasesCreator creator; + + TestInheritClass3 test3; + TestInheritClass4 test4; + TestInheritClass5 test5; + sb::di::details::ServiceInstanceList externals{ + sb::di::ServiceInstance{std::make_unique>(&test3)}}; + externals.add( + sb::di::ServiceInstance{std::make_unique>(&test4)}); + externals.add( + sb::di::ServiceInstance{std::make_unique>(&test5)}); + + const auto instances = + creator.tryCreateAll(descriptors, [&](const sb::di::ServiceDescriptor &) { return &externals; }, 5); + + EXPECT_TRUE(instances.empty()); + EXPECT_FALSE(instances.isSealed()); +} diff --git a/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp b/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp index d43132c..2c3319f 100644 --- a/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp +++ b/Tests/Unit/Core/ServiceInstancesCreatorTest.cpp @@ -176,7 +176,7 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateSkippedInheritedInstances) descriptors.add(sb::di::ServiceDescriber::describeSingleton()); descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - auto instances = creator.createAll(descriptors, 1); + const auto instances = creator.createAll(descriptors, 1); EXPECT_EQ(instances.size(), 2); EXPECT_FALSE(instances.isSealed()); @@ -269,7 +269,7 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateSkippedInheritedInstancesInPlace descriptors.add(sb::di::ServiceDescriber::describeSingleton()); descriptors.add(sb::di::ServiceDescriber::describeSingleton()); - auto instances = creator.createAll(descriptors, 1); + const auto instances = creator.createAll(descriptors, 1); EXPECT_EQ(instances.size(), 2); EXPECT_FALSE(instances.isSealed()); @@ -280,3 +280,20 @@ TEST_F(ServiceInstancesCreatorTest, ShouldCreateSkippedInheritedInstancesInPlace EXPECT_TRUE(instances[1].getAs()); EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass5)); } + +TEST_F(ServiceInstancesCreatorTest, ShouldNotCreateSkippedInheritedInstancesInPlace) +{ + ServiceProviderMock mock; + sb::di::details::ServiceInstancesCreator creator; + creator.setServiceProvider(mock); + + sb::di::details::ServiceDescriptorList descriptors{ + sb::di::ServiceDescriber::describeSingleton()}; + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + descriptors.add(sb::di::ServiceDescriber::describeSingleton()); + + const auto instances = creator.createAll(descriptors, 5); + + EXPECT_TRUE(instances.empty()); + EXPECT_FALSE(instances.isSealed()); +} diff --git a/Tests/Unit/OneOrListTest.cpp b/Tests/Unit/OneOrListTest.cpp index da99ae4..4b48f82 100644 --- a/Tests/Unit/OneOrListTest.cpp +++ b/Tests/Unit/OneOrListTest.cpp @@ -20,7 +20,7 @@ class OneOrListTest : public testing::Test TEST_F(OneOrListTest, ShouldCreateUninitialized) { - sb::di::OneOrList list; + const sb::di::OneOrList list; EXPECT_TRUE(list.isUninitialized()); EXPECT_TRUE(list.empty()); @@ -78,6 +78,25 @@ TEST_F(OneOrListTest, ShouldAdd) EXPECT_EQ(list[2], 4); } +TEST_F(OneOrListTest, ShouldAddList) +{ + sb::di::OneOrList list; + + list.add(2); + list.add(3); + list.add(4); + + sb::di::OneOrList list2; + list2.add(5); + list2.addList(std::move(list)); + + EXPECT_TRUE(list.isList()); + EXPECT_EQ(list2[0], 5); + EXPECT_EQ(list2[1], 2); + EXPECT_EQ(list2[2], 3); + EXPECT_EQ(list2[3], 4); +} + TEST_F(OneOrListTest, ShouldGetFirst) { sb::di::OneOrList list{2}; From 2094386f0ff54b96ac95df11f3264b18aa56cb41 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Thu, 25 Apr 2024 23:55:36 +0200 Subject: [PATCH 17/19] update creator code --- .../DI/Details/Core/Impl/ServiceInstancesCreator.hpp | 3 +-- Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp | 5 ++--- Include/SevenBit/DI/OneOrList.hpp | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp index ad91a57..3182d04 100644 --- a/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp @@ -37,10 +37,9 @@ namespace sb::di::details INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors, const bool inPlaceRequest, const std::size_t skipLast) { - ServiceInstanceList instances; const auto size = descriptors.size(); + ServiceInstanceList instances{size}; const auto take = skipLast <= size ? size - skipLast : 0; - instances.reserve(size); descriptors.forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) { if (index < take) { diff --git a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp index a7409ae..a7e7a9c 100644 --- a/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp +++ b/Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp @@ -16,9 +16,8 @@ namespace sb::di::details ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalsResolver, const std::size_t skipLast = 0) const { - ServiceInstanceList instances; const auto size = descriptors.size(); - instances.reserve(size); + ServiceInstanceList instances{size}; descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) { const auto lastDescriptorSkip = index + 1 == size ? skipLast : 0; tryCreateAll(instances, aliasDescriptor, originalsResolver(aliasDescriptor), lastDescriptorSkip); @@ -31,7 +30,7 @@ namespace sb::di::details template ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalsResolver) const { - ServiceInstanceList instances; + ServiceInstanceList instances{descriptors.size()}; descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor) { tryMapAll(instances, aliasDescriptor, originalsResolver(aliasDescriptor)); }); diff --git a/Include/SevenBit/DI/OneOrList.hpp b/Include/SevenBit/DI/OneOrList.hpp index 8293500..5f126d1 100644 --- a/Include/SevenBit/DI/OneOrList.hpp +++ b/Include/SevenBit/DI/OneOrList.hpp @@ -21,7 +21,7 @@ namespace sb::di public: OneOrList() = default; - explicit OneOrList(const std::size_t size) : _variant(std::vector{}) { reserve(size); } + explicit OneOrList(const std::size_t size) { reserve(size); } explicit OneOrList(T &&mainElement) : _variant(std::move(mainElement)) {} OneOrList(const OneOrList &) = delete; From 8e6af796fb3301ba1231f3f4b43f73f203255bc8 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Fri, 26 Apr 2024 17:02:08 +0200 Subject: [PATCH 18/19] remove cmake unused props --- Cmake/Setup.cmake | 18 ------------------ SingleHeader/CMakeLists.txt | 14 ++++++-------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/Cmake/Setup.cmake b/Cmake/Setup.cmake index c0ff726..129a186 100644 --- a/Cmake/Setup.cmake +++ b/Cmake/Setup.cmake @@ -31,24 +31,6 @@ set(_7BIT_DI_DI_DIR "${_7BIT_DI_INCLUDE_DIR}/SevenBit/DI") set(_7BIT_DI_DETAILS_DIR "${_7BIT_DI_DI_DIR}/Details") set(_7BIT_DI_MAIN_HEADER "${_7BIT_DI_INCLUDE_DIR}/SevenBit/DI.hpp") -file(GLOB _7BIT_DI_TOP_HEADERS "${_7BIT_DI_DI_DIR}/*.hpp") -file(GLOB _7BIT_DI_DETAILS_HEADERS - "${_7BIT_DI_DETAILS_DIR}/Containers/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Core/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Factories/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Helpers/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Services/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Utils/*.hpp" -) -file(GLOB _7BIT_DI_IMPL_HEADERS - "${_7BIT_DI_DI_DIR}/Impl/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Containers/Impl/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Core/Impl/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Factories/Impl/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Helpers/Impl/*.hpp" - "${_7BIT_DI_DETAILS_DIR}/Utils/Impl/*.hpp" -) -set(_7BIT_DI_ALL_HEADERS ${_7BIT_DI_MAIN_HEADER} ${_7BIT_DI_TOP_HEADERS} ${_7BIT_DI_DETAILS_HEADERS} ${_7BIT_DI_IMPL_HEADERS}) set(_7BIT_DI_LIBRARY_TYPE "Static" CACHE STRING "Library build type: Shared;Static;HeaderOnly") set(_7BIT_DI_LIBRARY_TYPE_VALUES "Shared;Static;HeaderOnly" CACHE STRING "List of possible _7BIT_DI_LIBRARY_TYPE values") diff --git a/SingleHeader/CMakeLists.txt b/SingleHeader/CMakeLists.txt index 28930f3..b0e7a08 100644 --- a/SingleHeader/CMakeLists.txt +++ b/SingleHeader/CMakeLists.txt @@ -4,14 +4,12 @@ set(_7BIT_DI_SINGLE_IN ${CMAKE_CURRENT_SOURCE_DIR}/SevenBitDI.hpp.in) set(_7BIT_DI_SINGLE_OUT ${CMAKE_CURRENT_BINARY_DIR}/SevenBitDI.hpp) add_custom_command(OUTPUT ${_7BIT_DI_SINGLE_OUT} - COMMAND - ${QUOM_EXECUTABLE} ${_7BIT_DI_SINGLE_IN} ${_7BIT_DI_SINGLE_OUT} -I ${_7BIT_DI_INCLUDE_DIR} - DEPENDS - ${_7BIT_DI_ALL_HEADERS} - COMMENT "Generating single header with Quom") + COMMAND + ${QUOM_EXECUTABLE} ${_7BIT_DI_SINGLE_IN} ${_7BIT_DI_SINGLE_OUT} -I ${_7BIT_DI_INCLUDE_DIR} + COMMENT "Generating single header with Quom") add_custom_target(GenerateSingleHeader - ALL DEPENDS - ${_7BIT_DI_SINGLE_OUT} - ${_7BIT_DI_MAIN_HEADER} + ALL DEPENDS + ${_7BIT_DI_SINGLE_OUT} + ${_7BIT_DI_MAIN_HEADER} ) From 930cdbc042157efb2cbdd7891d702b4b39618a85 Mon Sep 17 00:00:00 2001 From: 7bitcoder Date: Fri, 26 Apr 2024 17:25:53 +0200 Subject: [PATCH 19/19] remove code coverage from readme --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a0f2f5a..54db97f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ [![Windows](https://github.com/7bitcoder/7bitDI/actions/workflows/Windows.yml/badge.svg)](https://github.com/7bitcoder/7bitDI/actions/workflows/Windows.yml) [![MacOs](https://github.com/7bitcoder/7bitDI/actions/workflows/MacOs.yml/badge.svg)](https://github.com/7bitcoder/7bitDI/actions/workflows/MacOs.yml) [![Conan Center](https://img.shields.io/conan/v/7bitdi)](https://conan.io/center/recipes/7bitdi) -[![codecov](https://codecov.io/gh/7bitcoder/7bitDI/graph/badge.svg?token=UIC7KY8TZ3)](https://codecov.io/gh/7bitcoder/7bitDI)