Skip to content

Commit

Permalink
rename generic member to dynamic member
Browse files Browse the repository at this point in the history
  • Loading branch information
peacalm committed Jun 27, 2023
1 parent 9677c7b commit 9b50932
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 48 deletions.
54 changes: 27 additions & 27 deletions include/peacalm/luaw.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,8 @@ class luaw {
member_function = 1,
member_getter,
member_setter,
generic_member_getter,
generic_member_setter,
dynamic_member_getter,
dynamic_member_setter,
const_member,
nonconst_member_function,
nonvolatile_member_function
Expand Down Expand Up @@ -1738,22 +1738,22 @@ class luaw {
register_member<Hint, F>(name.c_str(), std::forward<F>(f));
}

/// Register generic members by provide generic member getter and setter.
/// Register dynamic members by provide dynamic member getter and setter.
/// getter/setter could be C function or lambda object.
/// getter proto type: Member(const Class*, Key)
/// setter proto type: void(Class*, Key, Member)
/// where Key could be `const std::string&` or 'const char*',
/// Member could be number, string, bool, luaw::luavalueidx,
/// luaw::luavalueref, etc.
template <typename Getter, typename Setter>
void register_generic_member(Getter&& getter, Setter&& setter) {
register_generic_member_getter(std::forward<Getter>(getter));
register_generic_member_setter(std::forward<Setter>(setter));
void register_dynamic_member(Getter&& getter, Setter&& setter) {
register_dynamic_member_getter(std::forward<Getter>(getter));
register_dynamic_member_setter(std::forward<Setter>(setter));
}
template <typename Getter>
void register_generic_member_getter(Getter&& getter);
void register_dynamic_member_getter(Getter&& getter);
template <typename Setter>
void register_generic_member_setter(Setter&& setter);
void register_dynamic_member_setter(Setter&& setter);

//////////////////////// evaluate expression /////////////////////////////////

Expand Down Expand Up @@ -3665,8 +3665,8 @@ struct luaw::metatable_factory<T*>
}
}

// generic member getter
l.rawgeti(-1, luaw::member_info_fields::generic_member_getter);
// dynamic member getter
l.rawgeti(-1, luaw::member_info_fields::dynamic_member_getter);
if (l.isnil(-1)) {
l.pop();
} else {
Expand Down Expand Up @@ -3733,8 +3733,8 @@ struct luaw::metatable_factory<T*>
}
}

// generic member setter
l.rawgeti(-1, luaw::member_info_fields::generic_member_setter);
// dynamic member setter
l.rawgeti(-1, luaw::member_info_fields::dynamic_member_setter);
if (l.isnil(-1)) {
l.pop();
} else if (l.isboolean(-1)) { // which is false
Expand Down Expand Up @@ -4009,16 +4009,16 @@ struct luaw::mock_mem_fn
//////////////////// registrar impl ////////////////////////////////////////////

template <typename Getter>
void luaw::register_generic_member_getter(Getter&& getter) {
void luaw::register_dynamic_member_getter(Getter&& getter) {
luaw::registrar<luaw_detail::detect_callable_cfunction_t<Getter>>::
register_generic_member_getter(
register_dynamic_member_getter(
*this, luaw::mock_mem_fn<Getter>(std::forward<Getter>(getter)));
}

template <typename Setter>
void luaw::register_generic_member_setter(Setter&& setter) {
void luaw::register_dynamic_member_setter(Setter&& setter) {
luaw::registrar<luaw_detail::detect_callable_cfunction_t<Setter>>::
register_generic_member_setter(
register_dynamic_member_setter(
*this, luaw::mock_mem_fn<Setter>(std::forward<Setter>(setter)));
}

Expand All @@ -4036,30 +4036,30 @@ struct luaw::registrar {
MemberFunction mf) = delete;

template <typename Getter>
static void register_generic_member_getter(luaw& l, Getter&& getter) = delete;
static void register_dynamic_member_getter(luaw& l, Getter&& getter) = delete;

template <typename Setter>
static void register_generic_member_setter(luaw& l, Setter&& setter) = delete;
static void register_dynamic_member_setter(luaw& l, Setter&& setter) = delete;
};

// Specialization for generic member getter
// Specialization for dynamic member getter
template <typename Member, typename Class, typename Key>
struct luaw::registrar<Member (*)(Class*, Key)> {
static_assert(std::is_class<Class>::value && std::is_const<Class>::value,
"First argument should be pointer of const class");
using DecayClass = std::remove_cv_t<Class>;

template <typename Getter>
static void register_generic_member_getter(luaw& l, Getter&& getter) {
static void register_dynamic_member_getter(luaw& l, Getter&& getter) {
#define REGISTER_GETTER(ObjectType) \
l.touchtb((void*)(&typeid(ObjectType)), LUA_REGISTRYINDEX) \
.setkv<Member (*)(Class*, Key)>( \
luaw::member_info_fields::generic_member_getter, getter);
luaw::member_info_fields::dynamic_member_getter, getter);

#define REGISTER_SMART_GETTER(ObjectType) \
l.touchtb((void*)(&typeid(ObjectType)), LUA_REGISTRYINDEX) \
.setkv<Member (*)(ObjectType, Key)>( \
luaw::member_info_fields::generic_member_getter, \
luaw::member_info_fields::dynamic_member_getter, \
[=](ObjectType o, Key k) -> Member { \
PEACALM_LUAW_ASSERT(o); \
return getter(*o, k); \
Expand Down Expand Up @@ -4096,32 +4096,32 @@ struct luaw::registrar<Member (*)(Class*, Key)> {
}
};

// Specialization for generic member setter
// Specialization for dynamic member setter
template <typename Class, typename Key, typename Member>
struct luaw::registrar<void (*)(Class*, Key, Member)> {
static_assert(std::is_class<Class>::value && !std::is_const<Class>::value,
"First argument should be pointer of non-const class");
using DecayClass = std::remove_cv_t<Class>;

template <typename Setter>
static void register_generic_member_setter(luaw& l, Setter&& setter) {
static void register_dynamic_member_setter(luaw& l, Setter&& setter) {
#define REGISTER_SETTER(ObjectType) \
l.touchtb((void*)(&typeid(ObjectType)), LUA_REGISTRYINDEX) \
.setkv<void (*)(Class*, Key, Member)>( \
luaw::member_info_fields::generic_member_setter, setter);
luaw::member_info_fields::dynamic_member_setter, setter);

#define REGISTER_SMART_SETTER(ObjectType) \
l.touchtb((void*)(&typeid(ObjectType)), LUA_REGISTRYINDEX) \
.setkv<void (*)(ObjectType, Key, Member)>( \
luaw::member_info_fields::generic_member_setter, \
luaw::member_info_fields::dynamic_member_setter, \
[=](ObjectType o, Key k, Member v) { \
PEACALM_LUAW_ASSERT(o); \
setter(*o, k, v); \
});

#define REGISTER_SETTER_OF_CONST(ObjectType) \
l.touchtb((void*)(&typeid(ObjectType)), LUA_REGISTRYINDEX) \
.setkv(luaw::member_info_fields::generic_member_setter, false);
.setkv(luaw::member_info_fields::dynamic_member_setter, false);

auto _g = l.make_guarder();

Expand Down
42 changes: 21 additions & 21 deletions test/unit_test/register_member.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct Obj {
int i = 1;
const int ci = 1;
volatile int vi = 1;
std::map<std::string, double> gm;
std::map<std::string, double> dm;

int geti() const { return i; }
int cv_geti() const volatile { return i; }
Expand Down Expand Up @@ -1088,21 +1088,21 @@ TEST(register_member, fake_member_variable_using_addr) {
}
}

double obj_gm_getter(const Obj* o, const char* k) {
double obj_dm_getter(const Obj* o, const char* k) {
assert(o);
auto it = o->gm.find(k);
if (it != o->gm.end()) return it->second;
auto it = o->dm.find(k);
if (it != o->dm.end()) return it->second;
return 0.0;
}

void obj_gm_setter(Obj* o, const char* k, double v) {
void obj_dm_setter(Obj* o, const char* k, double v) {
assert(o);
o->gm[k] = v;
o->dm[k] = v;
}

TEST(register_member, generic_member_cfunction) {
TEST(register_member, dynamic_member_cfunction) {
luaw l;
l.register_generic_member(obj_gm_getter, obj_gm_setter);
l.register_dynamic_member(obj_dm_getter, obj_dm_setter);
EXPECT_EQ(l.gettop(), 0);

{
Expand Down Expand Up @@ -1195,20 +1195,20 @@ TEST(register_member, generic_member_cfunction) {
}
}

TEST(register_member, generic_member_lambda) {
TEST(register_member, dynamic_member_lambda) {
luaw l;
auto g = [](const Obj* o, const char* k) {
assert(o);
auto it = o->gm.find(k);
if (it != o->gm.end()) return it->second;
auto it = o->dm.find(k);
if (it != o->dm.end()) return it->second;
return 0.0;
};
auto s = [](Obj* o, const char* k, double v) {
assert(o);
o->gm[k] = v;
o->dm[k] = v;
};

l.register_generic_member(g, s);
l.register_dynamic_member(g, s);
EXPECT_EQ(l.gettop(), 0);

{
Expand Down Expand Up @@ -1260,21 +1260,21 @@ TEST(register_member, generic_member_lambda) {
}
}

TEST(register_member, generic_member_volatile) {
TEST(register_member, dynamic_member_volatile) {
luaw l;

auto g = [](const Obj* o, const char* k) {
assert(o);
auto it = o->gm.find(k);
if (it != o->gm.end()) return it->second;
auto it = o->dm.find(k);
if (it != o->dm.end()) return it->second;
return 0.0;
};
auto s = [](Obj* o, const char* k, double v) {
assert(o);
o->gm[k] = v;
o->dm[k] = v;
};

l.register_generic_member(g, s);
l.register_dynamic_member(g, s);
EXPECT_EQ(l.gettop(), 0);

{
Expand All @@ -1292,18 +1292,18 @@ TEST(register_member, generic_member_volatile) {
struct Foo {
std::unordered_map<std::string, luaw::luavalueref> m;
};
luaw::luavalueref foo_ggetter(const Foo* o, const std::string& k) {
luaw::luavalueref foo_dm_getter(const Foo* o, const std::string& k) {
auto entry = o->m.find(k);
if (entry != o->m.end()) { return entry->second; }
return luaw::luavalueref();
}
void foo_gsetter(Foo* o, const std::string& k, const luaw::luavalueref& v) {
void foo_dm_setter(Foo* o, const std::string& k, const luaw::luavalueref& v) {
o->m[k] = v;
}

TEST(register_member, luavalueref) {
luaw l;
l.register_generic_member(foo_ggetter, foo_gsetter);
l.register_dynamic_member(foo_dm_getter, foo_dm_setter);
Foo foo{};
l.set("foo", &foo);
l.dostring("foo.a=1 foo.b=true foo.c='str' ");
Expand Down

0 comments on commit 9b50932

Please sign in to comment.