Skip to content

Commit 68f374a

Browse files
committed
update creators code
1 parent 4668f3f commit 68f374a

File tree

8 files changed

+104
-161
lines changed

8 files changed

+104
-161
lines changed

Include/SevenBit/DI/Details/Core/Impl/ServiceAliasesCreator.hpp

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,19 @@ namespace sb::di::details
2626
}
2727

2828
INLINE void ServiceAliasesCreator::tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor,
29-
const OneOrList<ServiceInstance> *originals) const
29+
const OneOrList<ServiceInstance> *originals,
30+
const size_t skipLast) const
3031
{
3132
if (originals)
3233
{
33-
instances.reserve(instances.size() + originals->size());
34-
originals->forEach([&](const ServiceInstance &instance) { instances.add(create(descriptor, instance)); });
35-
}
36-
}
37-
38-
INLINE void ServiceAliasesCreator::tryCreateRest(ServiceInstanceList &instances,
39-
const ServiceDescriptor &descriptor,
40-
const OneOrList<ServiceInstance> *originals,
41-
ServiceInstance &&first) const
42-
{
43-
if (originals)
44-
{
45-
const auto size = originals->size();
46-
instances.reserve(instances.size() + size);
47-
originals->forEach([&](const ServiceInstance &instance, const std::size_t index) {
48-
if (index < size - 1) // skip last
34+
const auto take = originals->size() - skipLast;
35+
instances.reserve(instances.size() + take);
36+
originals->forEach([&](const ServiceInstance &instance, const size_t index) {
37+
if (index < take)
4938
{
5039
instances.add(create(descriptor, instance));
5140
}
5241
});
53-
instances.add(std::move(first));
5442
}
5543
}
5644

@@ -73,9 +61,9 @@ namespace sb::di::details
7361
{
7462
RequireDescriptor::alias(descriptor);
7563
RequireInstance::valid(original);
76-
auto implementationType = descriptor.getImplementationTypeId();
7764

78-
auto implementation = std::make_unique<AliasService>(original.getAs<void>(), implementationType);
65+
auto implementation =
66+
std::make_unique<AliasService>(original.getAs<void>(), descriptor.getImplementationTypeId());
7967
return ServiceInstance{std::move(implementation), descriptor.getCastOffset()};
8068
}
8169
} // namespace sb::di::details

Include/SevenBit/DI/Details/Core/Impl/ServiceInstanceProvider.hpp

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ namespace sb::di::details
7070
{
7171
if (const auto descriptors = findDescriptors(id))
7272
{
73-
createRestInstances(*descriptors, *instances);
73+
auto newInstances = tryCreateInstances(*descriptors, instances->size());
74+
newInstances.add(std::move(*instances));
75+
*instances = std::move(newInstances);
7476
instances->seal();
7577
}
7678
}
@@ -183,31 +185,21 @@ namespace sb::di::details
183185
return selectCreator(descriptor).createInPlace(descriptor);
184186
}
185187

186-
INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateInstances(const ServiceDescriptorList &descriptors)
188+
INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateInstances(const ServiceDescriptorList &descriptors,
189+
const size_t skipLast)
187190
{
188191
const auto &descriptor = descriptors.last();
189192
if (descriptor.isAlias())
190193
{
191-
return getAliasesCreator().tryCreateAll(descriptors, [this](const ServiceDescriptor &original) {
192-
return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()});
193-
});
194-
}
195-
RequireDescriptor::nonTransient(descriptor);
196-
return selectCreator(descriptor).createAllInPlace(descriptors);
197-
}
198-
199-
INLINE void ServiceInstanceProvider::createRestInstances(const ServiceDescriptorList &descriptors,
200-
ServiceInstanceList &instances)
201-
{
202-
const auto &descriptor = descriptors.last();
203-
if (descriptor.isAlias())
204-
{
205-
return getAliasesCreator().tryCreateRest(descriptors, instances, [this](const ServiceDescriptor &original) {
206-
return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()});
207-
});
194+
return getAliasesCreator().tryCreateAll(
195+
descriptors,
196+
[this](const ServiceDescriptor &original) {
197+
return tryGetInstances({original.getImplementationTypeId(), original.getImplementationKey()});
198+
},
199+
skipLast);
208200
}
209201
RequireDescriptor::nonTransient(descriptor);
210-
selectCreator(descriptor).createRestInPlace(descriptors, instances);
202+
return selectCreator(descriptor).createAllInPlace(descriptors, skipLast);
211203
}
212204

213205
INLINE ServiceInstance ServiceInstanceProvider::tryCreateTransientInstance(const ServiceDescriptor &descriptor)

Include/SevenBit/DI/Details/Core/Impl/ServiceInstancesCreator.hpp

Lines changed: 17 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,61 +17,38 @@ namespace sb::di::details
1717
return create(descriptor, false);
1818
}
1919

20-
INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors)
21-
{
22-
return createAll(descriptors, false);
23-
}
24-
25-
INLINE void ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors,
26-
ServiceInstanceList &instances)
20+
INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors,
21+
const size_t skipLast)
2722
{
28-
return createRest(descriptors, instances, false);
23+
return createAll(descriptors, false, skipLast);
2924
}
3025

3126
INLINE ServiceInstance ServiceInstancesCreator::createInPlace(const ServiceDescriptor &descriptor)
3227
{
3328
return create(descriptor, true);
3429
}
3530

36-
INLINE ServiceInstanceList ServiceInstancesCreator::createAllInPlace(const ServiceDescriptorList &descriptors)
37-
{
38-
return createAll(descriptors, true);
39-
}
40-
41-
INLINE void ServiceInstancesCreator::createRestInPlace(const ServiceDescriptorList &descriptors,
42-
ServiceInstanceList &instances)
31+
INLINE ServiceInstanceList ServiceInstancesCreator::createAllInPlace(const ServiceDescriptorList &descriptors,
32+
const size_t skipLast)
4333
{
44-
return createRest(descriptors, instances, true);
34+
return createAll(descriptors, true, skipLast);
4535
}
4636

4737
INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors,
48-
const bool inPlaceRequest)
38+
const bool inPlaceRequest, const size_t skipLast)
4939
{
5040
ServiceInstanceList instances;
51-
instances.reserve(descriptors.size());
52-
descriptors.forEach(
53-
[&](const ServiceDescriptor &descriptor) { instances.add(create(descriptor, inPlaceRequest)); });
41+
const auto take = descriptors.size() - skipLast;
42+
instances.reserve(take);
43+
descriptors.forEach([&](const ServiceDescriptor &descriptor, const size_t index) {
44+
if (index < take)
45+
{
46+
instances.add(create(descriptor, inPlaceRequest));
47+
}
48+
});
5449
return instances;
5550
}
5651

57-
INLINE void ServiceInstancesCreator::createRest(const ServiceDescriptorList &descriptors,
58-
ServiceInstanceList &instances, const bool inPlaceRequest)
59-
{
60-
if (const auto size = descriptors.size(); size > 1)
61-
{
62-
instances.reserve(size);
63-
auto first = create(descriptors.first(), inPlaceRequest);
64-
descriptors.forEach([&](const ServiceDescriptor &descriptor, const std::size_t index) {
65-
if (index && index < size - 1) // skip first and last
66-
{
67-
instances.add(create(descriptor, inPlaceRequest));
68-
}
69-
});
70-
instances.add(std::move(first));
71-
std::swap(instances.first(), instances.last());
72-
}
73-
}
74-
7552
INLINE ServiceInstance ServiceInstancesCreator::create(const ServiceDescriptor &descriptor,
7653
const bool inPlaceRequest)
7754
{
@@ -80,7 +57,7 @@ namespace sb::di::details
8057
const auto &factory = *Require::notNullAndGet(descriptor.getImplementationFactory());
8158
auto _ = _circularDependencyGuard(descriptor.getImplementationTypeId());
8259

83-
auto implementation = factory.createInstance(provider, inPlaceRequest);
84-
return RequireInstance::validAndGet(ServiceInstance{std::move(implementation), descriptor.getCastOffset()});
60+
return RequireInstance::validAndGet(
61+
ServiceInstance{factory.createInstance(provider, inPlaceRequest), descriptor.getCastOffset()});
8562
}
8663
} // namespace sb::di::details

Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,16 @@ namespace sb::di::details
1313
ServiceInstance tryCreate(const ServiceDescriptor &descriptor, const ServiceInstance *original) const;
1414

1515
template <class TResolver>
16-
ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const
16+
ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver,
17+
const size_t skipLast = 0) const
1718
{
1819
ServiceInstanceList instances;
19-
descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor) {
20-
tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor));
21-
});
22-
return instances;
23-
}
24-
25-
template <class TResolver>
26-
void tryCreateRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances,
27-
TResolver originalResolver) const
28-
{
29-
auto first = std::move(instances.first());
30-
instances.clear();
3120
const auto size = descriptors.size();
32-
descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) {
33-
index < size - 1
34-
? tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor))
35-
: tryCreateRest(instances, aliasDescriptor, originalResolver(aliasDescriptor), std::move(first));
21+
descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const size_t index) {
22+
const auto lastDescriptorSkip = index + 1 == size ? skipLast : 0;
23+
tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor), lastDescriptorSkip);
3624
});
25+
return instances;
3726
}
3827

3928
ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const;
@@ -50,15 +39,13 @@ namespace sb::di::details
5039

5140
private:
5241
void tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor,
53-
const OneOrList<ServiceInstance> *originals) const;
54-
55-
void tryCreateRest(ServiceInstanceList &instances, const ServiceDescriptor &descriptor,
56-
const OneOrList<ServiceInstance> *originals, ServiceInstance &&first) const;
42+
const OneOrList<ServiceInstance> *originals, size_t skipLast = 0) const;
5743

5844
void tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor,
5945
OneOrList<ServiceInstance> &&originals) const;
6046

61-
ServiceInstance create(const ServiceDescriptor &descriptor, const ServiceInstance &original) const;
47+
[[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor,
48+
const ServiceInstance &original) const;
6249
};
6350
} // namespace sb::di::details
6451

Include/SevenBit/DI/Details/Core/ServiceInstanceProvider.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,11 @@ namespace sb::di::details
133133
[[nodiscard]] const ServiceDescriptorList *findDescriptors(const ServiceId &id) const;
134134
[[nodiscard]] const ServiceDescriptorList *findTransientDescriptors(const ServiceId &id) const;
135135

136-
ServiceLifeTime getLifeTime(const ServiceDescriptor &descriptor) const;
136+
[[nodiscard]] ServiceLifeTime getLifeTime(const ServiceDescriptor &descriptor) const;
137137
ServiceInstancesMap &getInstancesMap(ServiceLifeTime lifetime);
138138

139139
ServiceInstance tryCreateInstance(const ServiceDescriptor &descriptor);
140-
ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors);
141-
void createRestInstances(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances);
140+
ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors, size_t skipLast = 0);
142141

143142
ServiceInstance tryCreateTransientInstance(const ServiceDescriptor &descriptor);
144143
ServiceInstanceList tryCreateTransientInstances(const ServiceDescriptorList &descriptors);

Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,14 @@ namespace sb::di::details
1717
void setServiceProvider(ServiceProvider &serviceProvider) { _serviceProvider = &serviceProvider; }
1818

1919
ServiceInstance create(const ServiceDescriptor &descriptor);
20-
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors);
21-
void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances);
20+
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, size_t skipLast = 0);
2221

2322
ServiceInstance createInPlace(const ServiceDescriptor &descriptor);
24-
ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors);
25-
void createRestInPlace(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances);
23+
ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors, size_t skipLast = 0);
2624

2725
private:
2826
ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest);
29-
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest);
30-
void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, bool inPlaceRequest);
27+
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest, size_t skipLast);
3128
};
3229
} // namespace sb::di::details
3330

Tests/Unit/Core/ServiceAliasesCreatorTest.cpp

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -152,37 +152,37 @@ TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForNull)
152152
EXPECT_TRUE(instances.empty());
153153
}
154154

155-
TEST_F(ServiceAliasesCreatorTest, ShouldCreateRestAliases)
156-
{
157-
sb::di::details::ServiceDescriptorList descriptors{
158-
sb::di::ServiceDescriber::describeAlias<TestInheritClass1, TestInheritClass2>()};
159-
160-
constexpr sb::di::details::ServiceAliasesCreator creator;
161-
162-
TestInheritClass3 test3;
163-
TestInheritClass4 test4;
164-
TestInheritClass5 test5;
165-
sb::di::details::ServiceInstanceList externals{
166-
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass3>>(&test3)}};
167-
externals.add(
168-
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass4>>(&test4)});
169-
externals.add(
170-
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass5>>(&test5)});
171-
172-
sb::di::details::ServiceInstanceList instances{
173-
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass2>>(&test5)}};
174-
175-
creator.tryCreateRest(descriptors, instances, [&](const sb::di::ServiceDescriptor &) { return &externals; });
176-
177-
EXPECT_EQ(instances.size(), 3);
178-
EXPECT_FALSE(instances.isSealed());
179-
EXPECT_TRUE(instances[0].isValid());
180-
EXPECT_TRUE(instances[0].getAs<void>());
181-
EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
182-
EXPECT_TRUE(instances[1].isValid());
183-
EXPECT_TRUE(instances[1].getAs<void>());
184-
EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
185-
EXPECT_TRUE(instances[2].isValid());
186-
EXPECT_TRUE(instances[2].getAs<void>());
187-
EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
188-
}
155+
// TEST_F(ServiceAliasesCreatorTest, ShouldCreateRestAliases)
156+
// {
157+
// sb::di::details::ServiceDescriptorList descriptors{
158+
// sb::di::ServiceDescriber::describeAlias<TestInheritClass1, TestInheritClass2>()};
159+
//
160+
// constexpr sb::di::details::ServiceAliasesCreator creator;
161+
//
162+
// TestInheritClass3 test3;
163+
// TestInheritClass4 test4;
164+
// TestInheritClass5 test5;
165+
// sb::di::details::ServiceInstanceList externals{
166+
// sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass3>>(&test3)}};
167+
// externals.add(
168+
// sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass4>>(&test4)});
169+
// externals.add(
170+
// sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass5>>(&test5)});
171+
//
172+
// sb::di::details::ServiceInstanceList instances{
173+
// sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass2>>(&test5)}};
174+
//
175+
// creator.tryCreateRest(descriptors, instances, [&](const sb::di::ServiceDescriptor &) { return &externals; });
176+
//
177+
// EXPECT_EQ(instances.size(), 3);
178+
// EXPECT_FALSE(instances.isSealed());
179+
// EXPECT_TRUE(instances[0].isValid());
180+
// EXPECT_TRUE(instances[0].getAs<void>());
181+
// EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
182+
// EXPECT_TRUE(instances[1].isValid());
183+
// EXPECT_TRUE(instances[1].getAs<void>());
184+
// EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
185+
// EXPECT_TRUE(instances[2].isValid());
186+
// EXPECT_TRUE(instances[2].getAs<void>());
187+
// EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
188+
// }

0 commit comments

Comments
 (0)