From dc873d8c8f08143730139147f866480ce61eed1a Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 5 Feb 2023 13:25:45 -0800 Subject: [PATCH] ircd::m::event: Add exists_count() convenience; simplify various popcounts. --- include/ircd/m/event/event.h | 1 + matrix/event.cc | 17 +++++++++++++++++ matrix/event_auth.cc | 9 ++------- matrix/event_prev.cc | 9 ++------- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/include/ircd/m/event/event.h b/include/ircd/m/event/event.h index e0f83ac53..9f9010771 100644 --- a/include/ircd/m/event/event.h +++ b/include/ircd/m/event/event.h @@ -26,6 +26,7 @@ namespace ircd::m // parallel util; returns bitset uint64_t exists(const vector_view &); + size_t exists_count(const vector_view &); // Equality tests the event_id only! know this. bool operator==(const event &a, const event &b); diff --git a/matrix/event.cc b/matrix/event.cc index 9937524b8..f2e866eb4 100644 --- a/matrix/event.cc +++ b/matrix/event.cc @@ -1044,6 +1044,23 @@ ircd::m::operator==(const event &a, const event &b) return a.event_id == b.event_id; } +size_t +ircd::m::exists_count(const vector_view &event_ids) +{ + const auto mask + { + exists(event_ids) + }; + + const auto ret + { + __builtin_popcountl(mask) + }; + + assert(size_t(ret) <= event_ids.size()); + return ret; +} + uint64_t ircd::m::exists(const vector_view &event_ids) { diff --git a/matrix/event_auth.cc b/matrix/event_auth.cc index 3f47e1b4f..d490dc7d5 100644 --- a/matrix/event_auth.cc +++ b/matrix/event_auth.cc @@ -87,17 +87,12 @@ const return auth_event(i++); }); - const auto mask - { - m::exists({ids, i}) - }; - const auto ret { - __builtin_popcountl(mask) + m::exists_count({ids, i}) }; - assert(size_t(ret) <= max && size_t(ret) <= auth_events_count()); + assert(ret <= max && ret <= auth_events_count()); return ret; } diff --git a/matrix/event_prev.cc b/matrix/event_prev.cc index 3a918178e..6f6b4bc3e 100644 --- a/matrix/event_prev.cc +++ b/matrix/event_prev.cc @@ -114,17 +114,12 @@ const return prev_event(i++); }); - const auto mask - { - m::exists({ids, i}) - }; - const auto ret { - __builtin_popcountl(mask) + m::exists_count({ids, i}) }; - assert(size_t(ret) <= max && size_t(ret) <= prev_events_count()); + assert(ret <= max && ret <= prev_events_count()); return ret; }