| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #include "replicate_membership.h"
- namespace sunrise::middleware::bap::activity_message::replicate_membership {
- namespace {
- /** Both bodies end mid-byte, so the sizes are the meaningful bits rounded up. */
- static_assert(kEncodedSize * 8U >= kMeaningfulBitCount
- && kEncodedSize * 8U - kMeaningfulBitCount < 8U);
- static_assert(kRemoteHostEncodedSize * 8U >= kRemoteHostMeaningfulBitCount
- && kRemoteHostEncodedSize * 8U - kRemoteHostMeaningfulBitCount < 8U);
- static_assert(kRemoteHostMeaningfulBitCount == kMeaningfulBitCount + kRemoteMemberBitDelta);
- } // namespace
- /** Encodes one fixed full-player membership snapshot without allocation. */
- bool encode_replicate_membership(const MembershipSnapshot& snapshot,
- std::span<std::byte> output,
- std::size_t& written) noexcept {
- written = 0;
- const std::size_t size = encoded_size(snapshot);
- if (output.size() < size || !valid(snapshot)) {
- return false;
- }
- encoding::bits::Writer writer(output.first(size));
- const bool encoded = writer.write(1, 1) && writer.write(snapshot.revision, 32)
- && writer.write(snapshot.epoch, 32) && write_member_table(writer, snapshot)
- && writer.write(1, 1) && write_region_block(writer, snapshot)
- && writer.write(1, 1) && writer.write(occupied_member_mask(snapshot), 32)
- && writer.write(1, 1) && writer.write(occupied_member_mask(snapshot), 32)
- && writer.write(1, 1) && writer.write(active_view_mask(snapshot), 32)
- && writer.write(0, 1) && writer.write(0, 1);
- std::size_t encodedSize = 0;
- const std::size_t meaningfulBits = meaningful_bit_count(snapshot);
- if (!encoded || writer.bit_count() != meaningfulBits || !writer.finish(encodedSize)
- || encodedSize != size) {
- return false;
- }
- written = encodedSize;
- return true;
- }
- } // namespace sunrise::middleware::bap::activity_message::replicate_membership
|