refs #698 Added equalsBy and equalsByKeys methods for containers.

This commit is contained in:
Mathew Sutcliffe
2016-07-02 01:41:50 +01:00
parent e87d6b887c
commit bf61657376
3 changed files with 64 additions and 0 deletions

View File

@@ -72,6 +72,26 @@ namespace BlackMisc
template <class T> bool operator()(const T &a, const T &b) const { return head.isStable(a, b) ? head(a, b) : tail(a, b); }
};
//! \private
template <class...> struct EqualsByMembers;
//! \private
template <class M> struct EqualsByMembers<M>
{
M m;
EqualsByMembers(M m_) : m(m_) {}
template <class T> bool operator()(const T &a, const T &b) const { return (a.*m)() == (b.*m)(); }
};
//! \private
template <class M, class... Tail> struct EqualsByMembers<M, Tail...>
{
EqualsByMembers<M> head;
EqualsByMembers<Tail...> tail;
EqualsByMembers(M m, Tail... tail_) : head(m), tail(tail_...) {}
template <class T> bool operator()(const T &a, const T &b) const { return head(a, b) && tail(a, b); }
};
//! \private
struct Matches
{
@@ -141,6 +161,15 @@ namespace BlackMisc
return [value = std::forward<T>(value)](const T &object) { return object == value; };
}
/*!
* Returns a predicate that returns true if its arguments compare equal to each other, considering only the captured members.
*/
template <class... Ts>
Private::EqualsByMembers<Ts...> EqualsByMembers(Ts... vs)
{
return { vs... };
}
/*!
* Returns a predicate that returns true if its argument matches a captured CPropertyIndexVariantMap.
*/