Skip to content

Commit 77553d9

Browse files
committed
[VecOps] Do not enforce const-ness in Map function parameters
Before this commit, the lambda passed to VecOps::Map could not take arguments by non-const reference as the implementation was adding a const qualifier to the RVec arguments. We now instead forward RVecs from Map to MapImpl keeping their cv qualifiers. A test has been added.
1 parent c8843bf commit 77553d9

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

math/vecops/inc/ROOT/RVec.hxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ std::size_t GetVectorsSize(const std::string &id, const RVec<T> &... vs)
100100
return sizes[0];
101101
}
102102

103-
template <typename F, typename... T>
104-
auto MapImpl(F &&f, const RVec<T> &... vs) -> RVec<decltype(f(vs[0]...))>
103+
template <typename F, typename... RVecs>
104+
auto MapImpl(F &&f, RVecs &&... vs) -> RVec<decltype(f(vs[0]...))>
105105
{
106106
const auto size = GetVectorsSize("Map", vs...);
107107
RVec<decltype(f(vs[0]...))> ret(size);

math/vecops/test/vecops_rvec.cxx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,6 +1204,28 @@ TEST(VecOps, Map)
12041204
CheckEqual(res, ref);
12051205
}
12061206

1207+
TEST(VecOps, MapOnNestedVectors)
1208+
{
1209+
RVec<RVecF> vecOfVecs = {{1.f, 2.f}, {3.f}, {}};
1210+
RVecI sizes = {2, 1, 0};
1211+
1212+
auto size_by_value = [](RVecF v) { return v.size(); };
1213+
auto result = Map(vecOfVecs, size_by_value);
1214+
CheckEqual(result, sizes);
1215+
1216+
auto size_by_cvalue = [](const RVecF v) { return v.size(); };
1217+
result = Map(vecOfVecs, size_by_cvalue);
1218+
CheckEqual(result, sizes);
1219+
1220+
auto size_by_ref = [](RVecF &v) { return v.size(); };
1221+
result = Map(vecOfVecs, size_by_ref);
1222+
CheckEqual(result, sizes);
1223+
1224+
auto size_by_cref = [](const RVecF &v) { return v.size(); };
1225+
result = Map(vecOfVecs, size_by_cref);
1226+
CheckEqual(result, sizes);
1227+
}
1228+
12071229
TEST(VecOps, Construct)
12081230
{
12091231
RVec<float> pts {15.5f, 34.32f, 12.95f};

0 commit comments

Comments
 (0)