activity_replicate_membership_encoder.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "replicate_membership.h"
  2. namespace sunrise::middleware::bap::activity_message::replicate_membership {
  3. namespace {
  4. /** Both bodies end mid-byte, so the sizes are the meaningful bits rounded up. */
  5. static_assert(kEncodedSize * 8U >= kMeaningfulBitCount
  6. && kEncodedSize * 8U - kMeaningfulBitCount < 8U);
  7. static_assert(kRemoteHostEncodedSize * 8U >= kRemoteHostMeaningfulBitCount
  8. && kRemoteHostEncodedSize * 8U - kRemoteHostMeaningfulBitCount < 8U);
  9. static_assert(kRemoteHostMeaningfulBitCount == kMeaningfulBitCount + kRemoteMemberBitDelta);
  10. } // namespace
  11. /** Encodes one fixed full-player membership snapshot without allocation. */
  12. bool encode_replicate_membership(const MembershipSnapshot& snapshot,
  13. std::span<std::byte> output,
  14. std::size_t& written) noexcept {
  15. written = 0;
  16. const std::size_t size = encoded_size(snapshot);
  17. if (output.size() < size || !valid(snapshot)) {
  18. return false;
  19. }
  20. encoding::bits::Writer writer(output.first(size));
  21. const bool encoded = writer.write(1, 1) && writer.write(snapshot.revision, 32)
  22. && writer.write(snapshot.epoch, 32) && write_member_table(writer, snapshot)
  23. && writer.write(1, 1) && write_region_block(writer, snapshot)
  24. && writer.write(1, 1) && writer.write(occupied_member_mask(snapshot), 32)
  25. && writer.write(1, 1) && writer.write(occupied_member_mask(snapshot), 32)
  26. && writer.write(1, 1) && writer.write(active_view_mask(snapshot), 32)
  27. && writer.write(0, 1) && writer.write(0, 1);
  28. std::size_t encodedSize = 0;
  29. const std::size_t meaningfulBits = meaningful_bit_count(snapshot);
  30. if (!encoded || writer.bit_count() != meaningfulBits || !writer.finish(encodedSize)
  31. || encodedSize != size) {
  32. return false;
  33. }
  34. written = encodedSize;
  35. return true;
  36. }
  37. } // namespace sunrise::middleware::bap::activity_message::replicate_membership