global_obj_helper.hpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #ifndef SOPHIAR2_GLOBAL_OBJ_HELPER_HPP
  2. #define SOPHIAR2_GLOBAL_OBJ_HELPER_HPP
  3. #include "core/small_obj.hpp"
  4. #include "core/sophiar_manager.h"
  5. #include "utility/coro_signal2.hpp"
  6. namespace sophiar {
  7. template<typename SmallObjType, bool AutoSync = true>
  8. class global_obj_delegate {
  9. public:
  10. using pointer_type = typename SmallObjType::pointer;
  11. global_obj_delegate(sophiar_manager &_manager,
  12. global_obj_index_type _obj_index)
  13. : manager(_manager),
  14. watcher(_manager.request_global_obj_update_watcher(_obj_index)),
  15. obj_index(_obj_index) {}
  16. global_obj_delegate(sophiar_manager &_manager,
  17. const std::string &obj_name)
  18. : global_obj_delegate(_manager,
  19. _manager.register_global_obj<SmallObjType>(obj_name)) {}
  20. global_obj_delegate(global_obj_delegate &other) noexcept
  21. : manager(other.manager),
  22. watcher(std::move(other.watcher)),
  23. obj_index(other.obj_index),
  24. obj_ptr(std::move(other.obj_ptr)) {}
  25. void set_value(const pointer_type &ptr,
  26. timestamp_type ts = current_timestamp()) {
  27. assert(ptr.get() != nullptr);
  28. manager.update_global_obj<SmallObjType>(obj_index, ptr, ts);
  29. }
  30. pointer_type get_value() {
  31. if constexpr (AutoSync) {
  32. if (watcher.try_wait()) { // new value available
  33. obj_ptr = manager.get_global_obj<SmallObjType>(obj_index);
  34. }
  35. }
  36. return obj_ptr;
  37. }
  38. bool empty() {
  39. return get_value() == nullptr;
  40. }
  41. timestamp_type get_last_update_ts() const {
  42. return watcher.get_last_update_ts();
  43. }
  44. global_obj_delegate &operator=(const pointer_type &ptr) {
  45. set_value(ptr);
  46. return *this;
  47. }
  48. const SmallObjType &operator*() {
  49. assert(!empty());
  50. return *get_value();
  51. }
  52. const SmallObjType *operator->() {
  53. assert(!empty());
  54. return get_value().get();
  55. }
  56. boost::asio::awaitable<void> coro_wait_update(bool auto_sync = true) {
  57. co_await watcher.coro_wait(auto_sync);
  58. obj_ptr = manager.get_global_obj<SmallObjType>(obj_index);
  59. co_return;
  60. }
  61. private:
  62. global_obj_index_type obj_index;
  63. pointer_type obj_ptr;
  64. signal_watcher watcher;
  65. sophiar_manager &manager;
  66. };
  67. template<typename SmallObjType>
  68. using global_obj_auto_sync_delegate = global_obj_delegate<SmallObjType, true>;
  69. template<typename SmallObjType>
  70. using global_obj_manual_sync_delegate = global_obj_delegate<SmallObjType, false>;
  71. }
  72. #endif //SOPHIAR2_GLOBAL_OBJ_HELPER_HPP