Skip to content

Commit

Permalink
Use in-place construction rather than helper function.
Browse files Browse the repository at this point in the history
  • Loading branch information
helly25 committed Feb 29, 2024
1 parent 1122ba6 commit f1c859e
Showing 1 changed file with 29 additions and 43 deletions.
72 changes: 29 additions & 43 deletions mbo/container/any_scan.h
Original file line number Diff line number Diff line change
Expand Up @@ -348,60 +348,46 @@ class AnyScanImpl {
}

// NOLINTBEGIN(bugprone-forwarding-reference-overload)
template<AcceptableContainer Container>
requires(kAccessByRef)
static AccessFuncs MakeAccessFuncs(MakeAnyScanData<Container, kScanMode> data) {
using IteratorValueType = decltype(*std::declval<ContainerIterator<Container>>());
CheckCompatible<IteratorValueType, AccessType>();
return {
.iter =
[data = data] {
auto pos = MakeSharedIterator(data.container());
return IterFuncs{
.more = [data = data, pos = pos]() -> bool { return *pos != data.container().end(); },
.curr = [&it = *pos]() -> AccessType { return *it; },
.next = [&it = *pos] { ++it; },
};
},
.empty = [data = data] { return data.empty(); },
.size = [data = data] { return data.size(); },
};
}

template<AcceptableContainer Container>
requires(
!kAccessByRef // This is the ConvertingScan constructor
&& std::constructible_from<AccessType, ::mbo::types::ContainerConstIteratorValueType<Container>>
&& std::constructible_from<value_type, AccessType>)
static AccessFuncs MakeAccessFuncs(MakeAnyScanData<Container, kScanMode> data) {
return {
// NOTE: data must be copied here!
.iter =
[data = data] {
auto pos = MakeSharedIterator(data.container());
return IterFuncs{
.more = [data = data, pos = pos]() -> bool { return *pos != data.container().end(); },
.curr = [&it = *pos]() -> AccessType { return AccessType(*it); },
.next = [&it = *pos] { ++it; },
};
},
.empty = [data = data] { return data.empty(); },
.size = [data = data] { return data.size(); },
};
}

// For MakAnyScan / MakeConstScan
template<AcceptableContainer Container>
requires(kAccessByRef)
explicit AnyScanImpl(MakeAnyScanData<Container, kScanMode> data) : funcs_(MakeAccessFuncs(std::move(data))) {}
explicit AnyScanImpl(MakeAnyScanData<Container, kScanMode> data)
: funcs_{
.iter =
[data = data] {
auto pos = MakeSharedIterator(data.container());
return IterFuncs{
.more = [data = data, pos = pos]() -> bool { return *pos != data.container().end(); },
.curr = [&it = *pos]() -> AccessType { return *it; },
.next = [&it = *pos] { ++it; },
};
},
.empty = [data = data] { return data.empty(); },
.size = [data = data] { return data.size(); },
} {}

// For MakConvertingScan
template<AcceptableContainer Container>
requires(
!kAccessByRef // This is the ConvertingScan constructor
&& std::constructible_from<AccessType, ::mbo::types::ContainerConstIteratorValueType<Container>>
&& std::constructible_from<value_type, AccessType>)
explicit AnyScanImpl(MakeAnyScanData<Container, kScanMode> data) : funcs_(MakeAccessFuncs(std::move(data))) {}
explicit AnyScanImpl(MakeAnyScanData<Container, kScanMode> data)
: funcs_{
// NOTE: data must be copied here!
.iter =
[data = data] {
auto pos = MakeSharedIterator(data.container());
return IterFuncs{
.more = [data = data, pos = pos]() -> bool { return *pos != data.container().end(); },
.curr = [&it = *pos]() -> AccessType { return AccessType(*it); },
.next = [&it = *pos] { ++it; },
};
},
.empty = [data = data] { return data.empty(); },
.size = [data = data] { return data.size(); },
} {}

// NOLINTEND(bugprone-forwarding-reference-overload)

Expand Down

0 comments on commit f1c859e

Please sign in to comment.