9 static constexpr uint64_t READABLE = 1, WRITABLE = 2, STORAGE = 4, GUI = 8,
10 RW_STORAGE = READABLE + WRITABLE + STORAGE, FLAGS_DEFAULT = RW_STORAGE + GUI;
13 bool is_unset ()
const {
return flags == FLAGS_DEFAULT && infos.
empty(); }
14 bool operator== (
const MemberDetails &m)
const {
return flags == m.flags && infos == m.infos; }
16 info (
const String &key)
const
18 for (
const auto &kv : infos)
19 if (kv.size() > key.
size() && kv[key.
size()] ==
'=' &&
20 kv.compare (0, key.
size(), key) == 0)
29 ASE_ASSERT (old_meta.is_unset() || old_meta == *newmeta);
44template<
typename C,
typename R,
typename ...Args>
50template<
typename C,
typename R,
typename ...Args>
59 using FuncType =
typename std::decay<
decltype (Handler)>::type;
61 using ClassType =
typename FunctionTraits<
decltype (Handler)>::ClassType;
62 using ReturnType =
typename FunctionTraits<
decltype (Handler)>::ReturnType;
65template<
class C,
class M> C*
69 const ptrdiff_t member_offset = ptrdiff_t (member) - ptrdiff_t (host);
70 ASE_ASSERT (*hmoffsetp == -1 || *hmoffsetp == member_offset);
71 *hmoffsetp = member_offset;
74 const ptrdiff_t host_offset = ptrdiff_t (member) - *hmoffsetp;
75 host =
reinterpret_cast<C*
> (host_offset);
80bool kvpairs_assign (
StringS &kvs,
const String &key_value_pair);
85template<auto getter, auto setter =
nullptr>
89 using Class =
typename GetterTraits::ClassType;
99 static Class*
host_ (
const Member *m, Class *o =
nullptr) {
static ptrdiff_t d = -1;
return Lib::host_member_offset (&d, m, o); }
103 Member (Class *o,
const String &n =
"",
const StringS &s = {}) : Member (o, n, {}, {}, MemberDetails::FLAGS_DEFAULT, s,
false) {}
104 Member (Class *o,
const String &n,
const ParamInitialVal &iv,
const StringS &s = {}) : Member (o, n, iv, {}, MemberDetails::FLAGS_DEFAULT, s) {}
105 Member (Class *o,
const String &n,
const ParamInitialVal &iv,
const ParamExtraVals &ev,
const StringS &s = {}) : Member (o, n, iv, ev, MemberDetails::FLAGS_DEFAULT, s) {}
106 Member (Class *o,
const String &n,
const ParamExtraVals &ev,
const StringS &s = {}) : Member (o, n, {}, ev, MemberDetails::FLAGS_DEFAULT, s,
false) {}
107 Member (Class *o,
const String &n,
const ParamInitialVal &iv,
const ParamExtraVals &ev, uint64_t hints,
const StringS &s = {},
bool init =
true)
113 Lib::kvpairs_assign (meta.infos,
"ident=" + n);
116 constexpr bool has_register_parameter =
requires (Class *o, Member *m) { o->_register_parameter (o, m, ev); };
117 if constexpr (has_register_parameter)
118 o->_register_parameter (o,
this, ev);
128 using value_type = T;
129 T get ()
const {
return (
host_ (
this)->*getter) (); }
130 bool set (
const T &value)
137 T operator() ()
const {
return get(); }
139 operator T ()
const {
return get (); }
141 void notify ()
const {
host_ (
this)->emit_notify (info (
"ident")); }
142 static constexpr bool is_unique_per_member =
true;
144 static const StringS& infos () {
return meta_().infos; }
Implement C++ member field API with a 0-sized class from setter and getter, maybe combined with [[no_...
static Class * host_(const Member *m, Class *o=nullptr)
Resolve (or assign) host->Member distance (may be 0).
static const MemberDetails & meta_(const MemberDetails *n=nullptr)
Retrieve or assign property meta infos.
#define ASE_ASSERT(expr)
Issue an assertion warning if expr evaluates to false.
#define ASE_ASSERT_RETURN(expr,...)
Return from the current function if expr evaluates to false and issue an assertion warning.
C * host_member_offset(ptrdiff_t *hmoffsetp, const M *member, C *host)
Resolve (or assign) host->Member offset distance (may be 0).
The Anklang C++ API namespace.
std::vector< String > StringS
Convenience alias for a std::vector<std::string>.
std::variant< bool, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, float, double, const char *, std::string > ParamInitialVal
Initial value for parameters.
std::string String
Convenience alias for std::string.