refs #876 All metaclass mixins now directly access the metamembers.

This avoids bloating CMetaClassIntrospector with inconvenient convenience methods.
This commit is contained in:
Mathew Sutcliffe
2017-02-10 02:18:25 +00:00
parent 0e0f068471
commit 7b8d88876f
6 changed files with 30 additions and 79 deletions

View File

@@ -57,7 +57,7 @@ namespace BlackMisc
{
auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
bool result = baseEquals(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
meta.forEachMemberPair(a, b, [ & ](auto &&... args) { result = result && EqualsByMetaClass::membersEqual(std::forward<decltype(args)>(args)...); });
meta.forEachMember([ & ](auto member) { result = result && EqualsByMetaClass::membersEqual(member.in(a), member.in(b), member.m_flags); });
return result;
}
template <typename T> static bool baseEquals(const T *a, const T *b) { return *a == *b; }
@@ -122,7 +122,7 @@ namespace BlackMisc
auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
bool result = baseLess(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
bool gt = baseLess(static_cast<const TBaseOfT<Derived> *>(&b), static_cast<const TBaseOfT<Derived> *>(&a));
meta.forEachMemberPair(a, b, [ & ](auto &&... args) { result = result || LessThanByMetaClass::membersLess(gt, std::forward<decltype(args)>(args)...); });
meta.forEachMember([ & ](auto member) { result = result || LessThanByMetaClass::membersLess(gt, member.in(a), member.in(b), member.m_flags); });
return result;
}
template <typename T> static bool baseLess(const T *a, const T *b) { return *a < *b; }
@@ -158,7 +158,7 @@ namespace BlackMisc
{
auto meta = introspect<Derived>().without(MetaFlags<DisabledForComparison>());
int result = baseCompare(static_cast<const TBaseOfT<Derived> *>(&a), static_cast<const TBaseOfT<Derived> *>(&b));
meta.forEachMemberPair(a, b, [ & ](auto &&... args) { result = result ? result : CompareByMetaClass::membersCompare(std::forward<decltype(args)>(args)...); });
meta.forEachMember([ & ](auto member) { result = result ? result : CompareByMetaClass::membersCompare(member.in(a), member.in(b), member.m_flags); });
return result;
}
template <typename T> static int baseCompare(const T *a, const T *b) { return compare(*a, *b); }