PlasmaActivitiesStats

member_matcher.h
1/*
2 SPDX-FileCopyrightText: 2015 Ivan Cukic <ivan.cukic(at)kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#ifndef UTILS_MEMBER_MATCHER_H
8#define UTILS_MEMBER_MATCHER_H
9
10namespace kamd
11{
12namespace utils
13{
14namespace member_matcher
15{
16struct placeholder {
17} _;
18
19namespace detail
20{ //_
21enum ComparisonOperation {
22 Less,
23 LessOrEqual,
24 Equal,
25 GreaterOrEqual,
26 Greater,
27};
28
29// Member comparison object
30// Call operator returns true if:
31// collection item <comparison> specified item
32// where <comparison> can be <, >, ==, >=, <=
33template<typename Member, typename Value>
34struct member_comparator { //_
35
36 member_comparator(ComparisonOperation comparison, Member member, Value value)
37 : m_comparator(comparison)
38 , m_member(member)
39 , m_value(value)
40 {
41 }
42
43 const ComparisonOperation m_comparator;
44 const Member m_member;
45 const Value m_value;
46
47 // When passing only a item to compare with,
48 // it means that we already have the value for comparison.
49 // For example (member(M) > 5)(2)
50 template<typename T>
51 inline bool operator()(const T &collItem) const
52 {
53 return operator()(collItem, m_value);
54 }
55
56 // When passing the placeholder aka 'ignore' as a value,
57 // it means that we already have the value for comparison.
58 // For example (member(M) > 5)(collItem, _)
59 template<typename T>
60 inline bool operator()(const T &collItem, const placeholder &) const
61 {
62 return operator()(collItem, m_value);
63 }
64
65 // Like the previous one, but with reversed argument order
66 template<typename T>
67 inline bool operator()(const placeholder &, const T &collItem) const
68 {
69 return compare(m_value, (collItem.*m_member)());
70 }
71
72 // Comparing two values
73 // For example (member(M) > _)(item, 5)
74 template<typename T, typename V>
75 inline bool operator()(const T &collItem, const V &value) const
76 {
77 // TODO: Make this work if the arguments are reversed,
78 // or even if both arhuments need to be checked
79 // for the specified member
80 return compare((collItem.*m_member)(), value);
81 }
82
83private:
84 template<typename Left, typename Right>
85 inline bool compare(const Left &left, const Right &right) const
86 {
87 return m_comparator == Less ? left < right
88 : m_comparator == LessOrEqual ? left <= right
89 : m_comparator == Equal ? left == right
90 : m_comparator == GreaterOrEqual ? left >= right
91 : m_comparator == Greater ? left > right
92 : false;
93 }
94
95}; //^
96
97// Chaining multiple comparators to achieve lexicographical
98// comparison of multiple members in order.
99// This would me so much nicer with variadic templates... f**ing MSVC.
100template<typename First, typename Second>
101struct member_comparator_chain {
102 member_comparator_chain(First first, Second second)
103 : first(first)
104 , second(second)
105 {
106 }
107
108 // Implement if needed...
109 // template <typename T>
110 // inline bool operator()(const T &item) const
111 // {
112 // return first(item) || second(item);
113 // }
114
115 template<typename T, typename V>
116 inline bool operator()(const T &item, const V &value) const
117 {
118 return first(item, value) || (!first(value, item) && second(item, value));
119 }
120
121 First first;
122 Second second;
123};
124
125template<typename First, typename Second>
126inline member_comparator_chain<First, Second> operator&&(First first, Second second)
127{
128 return member_comparator_chain<First, Second>(first, second);
129}
130
131// Provides syntax sugar for building member comparators
132template<typename Member>
133struct member_matcher { //_
134 member_matcher(Member m)
135 : m_member(m)
136 {
137 }
138
139#define IMPLEMENT_COMPARISON_OPERATOR(OPERATOR, NAME) \
140 template<typename Value> \
141 inline member_comparator<Member, Value> operator OPERATOR(const Value &value) const \
142 { \
143 return member_comparator<Member, Value>(NAME, m_member, value); \
144 }
145
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)
151
152#undef IMPLEMENT_COMPARISON_OPERATOR
153
154 Member m_member;
155}; //^
156
157} //^ namespace detail
158
159template<typename Member>
160detail::member_matcher<Member> member(Member m)
161{
162 return detail::member_matcher<Member>(m);
163}
164} // namespace member
165
166} // namespace utils
167} // namespace kamd
168
169#endif // UTILS_MEMBER_MATCHER_H
QTextStream & left(QTextStream &stream)
QTextStream & right(QTextStream &stream)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Feb 28 2025 12:01:02 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.