Skip to content

Commit 749704f

Browse files
committed
add break to foreach
1 parent 68f374a commit 749704f

File tree

7 files changed

+51
-40
lines changed

7 files changed

+51
-40
lines changed

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,16 @@ namespace sb::di::details
2727

2828
INLINE void ServiceAliasesCreator::tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor,
2929
const OneOrList<ServiceInstance> *originals,
30-
const size_t skipLast) const
30+
const std::size_t skipLast) const
3131
{
3232
if (originals)
3333
{
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)
38-
{
39-
instances.add(create(descriptor, instance));
40-
}
34+
const auto size = originals->size();
35+
instances.reserve(size);
36+
auto take = size - skipLast;
37+
originals->forEach([&](const ServiceInstance &instance) {
38+
instances.add(create(descriptor, instance));
39+
return --take;
4140
});
4241
}
4342
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ namespace sb::di::details
186186
}
187187

188188
INLINE ServiceInstanceList ServiceInstanceProvider::tryCreateInstances(const ServiceDescriptorList &descriptors,
189-
const size_t skipLast)
189+
const std::size_t skipLast)
190190
{
191191
const auto &descriptor = descriptors.last();
192192
if (descriptor.isAlias())

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace sb::di::details
1818
}
1919

2020
INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors,
21-
const size_t skipLast)
21+
const std::size_t skipLast)
2222
{
2323
return createAll(descriptors, false, skipLast);
2424
}
@@ -29,22 +29,21 @@ namespace sb::di::details
2929
}
3030

3131
INLINE ServiceInstanceList ServiceInstancesCreator::createAllInPlace(const ServiceDescriptorList &descriptors,
32-
const size_t skipLast)
32+
const std::size_t skipLast)
3333
{
3434
return createAll(descriptors, true, skipLast);
3535
}
3636

3737
INLINE ServiceInstanceList ServiceInstancesCreator::createAll(const ServiceDescriptorList &descriptors,
38-
const bool inPlaceRequest, const size_t skipLast)
38+
const bool inPlaceRequest, const std::size_t skipLast)
3939
{
4040
ServiceInstanceList instances;
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-
}
41+
const auto size = descriptors.size();
42+
instances.reserve(size);
43+
auto take = size - skipLast;
44+
descriptors.forEach([&](const ServiceDescriptor &descriptor) {
45+
instances.add(create(descriptor, inPlaceRequest));
46+
return --take;
4847
});
4948
return instances;
5049
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,33 @@ 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,
17-
const size_t skipLast = 0) const
16+
ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalsResolver,
17+
const std::size_t skipLast = 0) const
1818
{
1919
ServiceInstanceList instances;
2020
const auto size = descriptors.size();
21-
descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const size_t index) {
21+
descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor, const std::size_t index) {
2222
const auto lastDescriptorSkip = index + 1 == size ? skipLast : 0;
23-
tryCreateAll(instances, aliasDescriptor, originalResolver(aliasDescriptor), lastDescriptorSkip);
23+
tryCreateAll(instances, aliasDescriptor, originalsResolver(aliasDescriptor), lastDescriptorSkip);
2424
});
2525
return instances;
2626
}
2727

2828
ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const;
2929

3030
template <class TResolver>
31-
ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const
31+
ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalsResolver) const
3232
{
3333
ServiceInstanceList instances;
3434
descriptors.forEach([&](const ServiceDescriptor &aliasDescriptor) {
35-
tryMapAll(instances, aliasDescriptor, originalResolver(aliasDescriptor));
35+
tryMapAll(instances, aliasDescriptor, originalsResolver(aliasDescriptor));
3636
});
3737
return instances;
3838
}
3939

4040
private:
4141
void tryCreateAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor,
42-
const OneOrList<ServiceInstance> *originals, size_t skipLast = 0) const;
42+
const OneOrList<ServiceInstance> *originals, std::size_t skipLast = 0) const;
4343

4444
void tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor,
4545
OneOrList<ServiceInstance> &&originals) const;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ namespace sb::di::details
137137
ServiceInstancesMap &getInstancesMap(ServiceLifeTime lifetime);
138138

139139
ServiceInstance tryCreateInstance(const ServiceDescriptor &descriptor);
140-
ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors, size_t skipLast = 0);
140+
ServiceInstanceList tryCreateInstances(const ServiceDescriptorList &descriptors, std::size_t skipLast = 0);
141141

142142
ServiceInstance tryCreateTransientInstance(const ServiceDescriptor &descriptor);
143143
ServiceInstanceList tryCreateTransientInstances(const ServiceDescriptorList &descriptors);

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

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

1919
ServiceInstance create(const ServiceDescriptor &descriptor);
20-
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, size_t skipLast = 0);
20+
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, std::size_t skipLast = 0);
2121

2222
ServiceInstance createInPlace(const ServiceDescriptor &descriptor);
23-
ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors, size_t skipLast = 0);
23+
ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors, std::size_t skipLast = 0);
2424

2525
private:
2626
ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest);
27-
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest, size_t skipLast);
27+
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest,
28+
std::size_t skipLast);
2829
};
2930
} // namespace sb::di::details
3031

Include/SevenBit/DI/OneOrList.hpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,7 @@ namespace sb::di
176176
}
177177
else if (auto list = tryGetAsList())
178178
{
179-
std::size_t index = 0;
180-
for (auto &instance : *list)
181-
{
182-
callFcn(fcn, instance, index++);
183-
}
179+
listForEach(*list, fcn);
184180
}
185181
}
186182

@@ -192,11 +188,7 @@ namespace sb::di
192188
}
193189
else if (auto list = tryGetAsList())
194190
{
195-
std::size_t index = 0;
196-
for (const auto &instance : *list)
197-
{
198-
callFcn(fcn, instance, index++);
199-
}
191+
listForEach(*list, fcn);
200192
}
201193
}
202194

@@ -234,6 +226,26 @@ namespace sb::di
234226
}
235227
}
236228

229+
template <class TList, class TFunc> static void listForEach(TList &list, TFunc &fcn)
230+
{
231+
std::size_t index = 0;
232+
for (auto &instance : list)
233+
{
234+
using Ret = decltype(callFcn(fcn, instance, 0));
235+
if constexpr (std::is_integral_v<Ret>)
236+
{
237+
if (!callFcn(fcn, instance, index++))
238+
{
239+
break;
240+
}
241+
}
242+
else
243+
{
244+
callFcn(fcn, instance, index++);
245+
}
246+
}
247+
}
248+
237249
template <class TFunc, class TItem> static auto callFcn(TFunc &fcn, TItem &item, std::size_t index)
238250
{
239251
if constexpr (std::is_invocable_v<TFunc, TItem &>)

0 commit comments

Comments
 (0)