59 lines
1.7 KiB
C++
59 lines
1.7 KiB
C++
/** @file CallbackId.hpp
|
|
*
|
|
* @author Roland Conybeare, Aug 2026
|
|
**/
|
|
|
|
#pragma once
|
|
|
|
#include <cstdint>
|
|
|
|
namespace xo::fn {
|
|
/* identifies a particular callback in a CallbackSet (see below).
|
|
* an unique id is created:
|
|
* CallbackSetImpl cbset = ...;
|
|
* CallbackId cb_id = cbset.add_callback(..);
|
|
*
|
|
* can use id to remove callback later:
|
|
* cbset.remove_callback(cb_id);
|
|
*
|
|
* Tag so xo-callback can be header-only
|
|
*/
|
|
template <typename Tag>
|
|
class CallbackIdImpl {
|
|
public:
|
|
CallbackIdImpl() = default;
|
|
explicit CallbackIdImpl(uint32_t id) : id_{id} {}
|
|
|
|
/* generate a globally-unique id (not threadsafe) */
|
|
static CallbackIdImpl generate() {
|
|
static CallbackIdImpl s_last_id;
|
|
|
|
s_last_id = CallbackIdImpl(s_last_id.id() + 1);
|
|
|
|
return s_last_id;
|
|
} /*generate*/
|
|
|
|
uint32_t id() const { return id_; }
|
|
|
|
/** member pointer to the private id_: so a subsystem with
|
|
* reflection can describe CallbackIdImpl (e.g.
|
|
* sr.reflect_member("id", CallbackId::id_address())) without
|
|
* xo-callback depending on xo-reflect. See
|
|
* xo-webutil's reflect_callback_id()
|
|
**/
|
|
static constexpr uint32_t CallbackIdImpl::* id_address() { return &CallbackIdImpl::id_; }
|
|
|
|
private:
|
|
uint32_t id_ = 0;
|
|
}; /*CallbackIdImpl*/
|
|
|
|
template <typename Tag>
|
|
inline bool operator==(CallbackIdImpl<Tag> lhs, CallbackIdImpl<Tag> rhs) { return lhs.id() == rhs.id(); }
|
|
template <typename Tag>
|
|
inline bool operator!=(CallbackIdImpl<Tag> lhs, CallbackIdImpl<Tag> rhs) { return lhs.id() != rhs.id(); }
|
|
|
|
using CallbackId = CallbackIdImpl<class CallbackId_tag>;
|
|
|
|
}
|
|
|
|
/* end CallbackId.hpp */
|