Skip to content

Commit 0e8e6d1

Browse files
committed
Add size and shape methods for nestedelementcollection
1 parent 1fb49a2 commit 0e8e6d1

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

src/games/gameobject.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,26 @@ template <class T, auto OuterMemFn, auto InnerMemFn> class NestedElementCollecti
302302

303303
explicit NestedElementCollection(T owner) : m_owner(owner) {}
304304

305+
/// @brief Return the total number of elements summed across all inner ranges
306+
std::size_t size() const
307+
{
308+
auto outer = (m_owner->*OuterMemFn)();
309+
return std::accumulate(
310+
outer.begin(), outer.end(), static_cast<std::size_t>(0),
311+
[](std::size_t acc, auto &elem) { return acc + (elem.*InnerMemFn)().size(); });
312+
}
313+
314+
/// @brief Returns the shape, a vector of the sizes of the inner ranges
315+
std::vector<std::size_t> shape() const
316+
{
317+
std::vector<std::size_t> result;
318+
auto outer = (m_owner->*OuterMemFn)();
319+
result.reserve(outer.size());
320+
std::transform(outer.begin(), outer.end(), std::back_inserter(result),
321+
[](const auto &element) { return (element.*InnerMemFn)().size(); });
322+
return result;
323+
}
324+
305325
iterator begin() const { return {m_owner, false}; }
306326
iterator end() const { return {m_owner, true}; }
307327
};

0 commit comments

Comments
 (0)