void retire(D d = D(), rcu_domain& dom = rcu_default_domain()) noexcept;
void lock() noexcept;
bool try_lock() noexcept;
void unlock() noexcept;
rcu_domain& rcu_default_domain() noexcept;
void rcu_synchronize(rcu_domain& dom = rcu_default_domain()) noexcept;
void rcu_barrier(rcu_domain& dom = rcu_default_domain()) noexcept;
template<class T, class D = default_delete<T>>
void rcu_retire(T* p, D d = D(), rcu_domain& dom = rcu_default_domain());
void retire(D d = D()) noexcept;
hazard_pointer() noexcept;
hazard_pointer(hazard_pointer&& other) noexcept;
~hazard_pointer();
hazard_pointer& operator=(hazard_pointer&& other) noexcept;
[[nodiscard]] bool empty() const noexcept;
template<class T> T* protect(const atomic<T*>& src) noexcept;
template<class T> bool try_protect(T*& ptr, const atomic<T*>& src) noexcept;
template<class T> void reset_protection(const T* ptr) noexcept;
void reset_protection(nullptr_t = nullptr) noexcept;
void swap(hazard_pointer& other) noexcept;
hazard_pointer make_hazard_pointer();
void swap(hazard_pointer& a, hazard_pointer& b) noexcept;