mission_observation_epoch.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #pragma once
  2. #include <cstdint>
  3. namespace sunrise::server::activity::mission::observation_epoch {
  4. /** Reported Sense object identity. This is not an individual actor generation or death receipt. */
  5. struct Cursor final {
  6. std::uint64_t sourceGeneration{};
  7. std::uint64_t sequence{};
  8. std::uint32_t generationPlusOne{};
  9. bool hasGeneration{};
  10. bool used{};
  11. };
  12. enum class Transition : std::uint8_t { discard, baseline, continuous };
  13. /**
  14. * Counts from different reported object generations cannot form a gameplay edge. Missing
  15. * generations also require reconciliation, following Host's same_sense_scalar_generations rule.
  16. * The caller publishes a baseline as state and never derives a death from it.
  17. */
  18. [[nodiscard]] inline Transition accept(Cursor& retained,
  19. std::uint64_t expectedSourceGeneration,
  20. std::uint64_t sourceGeneration,
  21. std::uint64_t sequence,
  22. std::uint32_t generationPlusOne,
  23. bool hasGeneration) noexcept {
  24. if (sourceGeneration == 0 || sourceGeneration != expectedSourceGeneration || sequence == 0
  25. || (retained.used && retained.sourceGeneration == sourceGeneration
  26. && sequence <= retained.sequence)) {
  27. return Transition::discard;
  28. }
  29. const bool continuous = retained.used && retained.sourceGeneration == sourceGeneration
  30. && retained.hasGeneration && hasGeneration
  31. && retained.generationPlusOne == generationPlusOne;
  32. retained = {sourceGeneration, sequence, generationPlusOne, hasGeneration, true};
  33. return continuous ? Transition::continuous : Transition::baseline;
  34. }
  35. } // namespace sunrise::server::activity::mission::observation_epoch