7#ifndef UTILS_MEMBER_MATCHER_H
8#define UTILS_MEMBER_MATCHER_H
14namespace member_matcher
21enum ComparisonOperation {
33template<
typename Member,
typename Value>
34struct member_comparator {
36 member_comparator(ComparisonOperation comparison, Member member, Value value)
37 : m_comparator(comparison)
43 const ComparisonOperation m_comparator;
44 const Member m_member;
51 inline bool operator()(
const T &collItem)
const
53 return operator()(collItem, m_value);
60 inline bool operator()(
const T &collItem,
const placeholder &)
const
62 return operator()(collItem, m_value);
67 inline bool operator()(
const placeholder &,
const T &collItem)
const
69 return compare(m_value, (collItem.*m_member)());
74 template<
typename T,
typename V>
75 inline bool operator()(
const T &collItem,
const V &value)
const
80 return compare((collItem.*m_member)(), value);
84 template<
typename Left,
typename Right>
85 inline bool compare(
const Left &left,
const Right &right)
const
87 return m_comparator == Less ?
left <
right
88 : m_comparator == LessOrEqual ?
left <=
right
90 : m_comparator == GreaterOrEqual ?
left >=
right
100template<
typename First,
typename Second>
101struct member_comparator_chain {
102 member_comparator_chain(First first, Second second)
115 template<
typename T,
typename V>
116 inline bool operator()(
const T &item,
const V &value)
const
118 return first(item, value) || (!first(value, item) && second(item, value));
125template<
typename First,
typename Second>
126inline member_comparator_chain<First, Second> operator&&(First first, Second second)
128 return member_comparator_chain<First, Second>(first, second);
132template<
typename Member>
133struct member_matcher {
134 member_matcher(Member m)
139#define IMPLEMENT_COMPARISON_OPERATOR(OPERATOR, NAME) \
140 template<typename Value> \
141 inline member_comparator<Member, Value> operator OPERATOR(const Value &value) const \
143 return member_comparator<Member, Value>(NAME, m_member, value); \
146 IMPLEMENT_COMPARISON_OPERATOR(<, Less)
147 IMPLEMENT_COMPARISON_OPERATOR(<=, LessOrEqual)
148 IMPLEMENT_COMPARISON_OPERATOR(==, Equal)
149 IMPLEMENT_COMPARISON_OPERATOR(>=, GreaterOrEqual)
150 IMPLEMENT_COMPARISON_OPERATOR(>, Greater)
152#undef IMPLEMENT_COMPARISON_OPERATOR
159template<
typename Member>
160detail::member_matcher<Member> member(Member m)
162 return detail::member_matcher<Member>(m);
QTextStream & left(QTextStream &stream)
QTextStream & right(QTextStream &stream)