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.