Jpp 19.3.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JLang/JComparator.hh
Go to the documentation of this file.
1#ifndef __JLANG__JCOMPARATOR__
2#define __JLANG__JCOMPARATOR__
3
4#include "JLang/JClass.hh"
6
7
8/**
9 * \author mdejong
10 */
11
12namespace JLANG {}
13namespace JPP { using namespace JLANG; }
14
15namespace JLANG {
16
17 /**
18 * Template definition of auxiliary class to compare objects.
19 * The first template argument refers to the data member or member method and
20 * the second template argument to the comparator of the corresponding values.
21 */
22 template<class JTypename_t, class JComparator_t = JComparison::lt>
24
25
26 /**
27 * Template specialisation of JComparator for comparison between values of data members.
28 */
29 template<class T, class JResult_t, class JComparator_t>
30 class JComparator<JResult_t T::*, JComparator_t> {
31 public:
32
33 typedef JResult_t T::*data_member; //!< Type definition of data member
34 typedef JComparator_t comparator_type; //!< Type definition of comparator
35
36
37 /**
38 * Constructor.
39 *
40 * \param member pointer to data member
41 * \param comparator comparator method
42 */
44 const comparator_type& comparator = comparator_type()) :
45 member (member),
46 comparator(comparator)
47 {}
48
49
50 /**
51 * Compare objects.
52 *
53 * \param first first object
54 * \param second second object
55 * \return result of comparison of return values
56 */
57 bool operator()(const T& first, const T& second) const
58 {
59 return comparator(first.*member, second.*member);
60 }
61
62
63 /**
64 * Compare object to value.
65 *
66 * \param first first object
67 * \param second second value
68 * \return result of comparison of return values
69 */
70 bool operator()(const T& first, typename JClass<JResult_t>::argument_type second) const
71 {
72 return comparator(first.*member, second);
73 }
74
75 protected:
78 };
79
80
81 /**
82 * Template specialisation of JComparator for comparison between return values of member methods.
83 */
84 template<class T, class JResult_t, class JComparator_t>
85 class JComparator<JResult_t (T::*)() const, JComparator_t> {
86 public:
87
88 typedef JResult_t (T::*member_method)() const; //!< Type definition of member method
89 typedef JComparator_t comparator_type; //!< Type definition of comparator
90
91
92 /**
93 * Constructor.
94 *
95 * \param function pointer to member method
96 * \param comparator comparator method
97 */
98 JComparator(member_method function,
99 const comparator_type& comparator = comparator_type()) :
100 function (function),
101 comparator(comparator)
102 {}
103
104
105 /**
106 * Compare objects.
107 *
108 * \param first first object
109 * \param second second object
110 * \return result of comparison of return values
111 */
112 bool operator()(const T& first, const T& second) const
113 {
114 return comparator((first.*function)(), (second.*function)());
115 }
116
117
118 /**
119 * Compare object to value.
120 *
121 * \param first first object
122 * \param second second value
123 * \return result of comparison of return values
124 */
125 bool operator()(const T& first, typename JClass<JResult_t>::argument_type second) const
126 {
127 return comparator((first.*function)(), second);
128 }
129
130 protected:
131 member_method function;
133 };
134
135
136 /**
137 * Template specialisation of JComparator for comparison between return values of member methods.
138 */
139 template<class T, class JComparator_t>
140 class JComparator<const T& (T::*)() const, JComparator_t> {
141 public:
142
143 typedef const T& (T::*member_method)() const; //!< Type definition of member method
144 typedef JComparator_t comparator_type; //!< Type definition of comparator
145
146
147 /**
148 * Constructor.
149 *
150 * \param function pointer to member method
151 * \param comparator comparator method
152 */
153 JComparator(member_method function,
154 const comparator_type& comparator = comparator_type()) :
155 function (function),
156 comparator(comparator)
157 {}
158
159
160 /**
161 * Compare objects.
162 *
163 * \param first first object
164 * \param second second object
165 * \return result of comparison of return values
166 */
167 bool operator()(const T& first, const T& second) const
168 {
169 return comparator((first.*function)(), (second.*function)());
170 }
171
172 protected:
173 member_method function;
175 };
176
177
178 /**
179 * Helper method to create comparator between values of data member.
180 *
181 * \param member pointer to data member
182 * \return comparator between objects
183 */
184 template<class T, class JResult_t>
189
190
191 /**
192 * Helper method to create comparator between values of data member.
193 *
194 * \param member pointer to data member
195 * \param comparator comparator between values of data members
196 * \return comparator between objects
197 */
198 template<class T, class JResult_t, class JComparator_t>
200 const JComparator_t& comparator)
201 {
202 return JComparator<JResult_t T::*, JComparator_t>(member, comparator);
203 }
204
205
206 /**
207 * Helper method to create comparator between return values of member method.
208 *
209 * \param function pointer to member method
210 * \return comparator between objects
211 */
212 template<class T, class JResult_t>
213 JComparator<JResult_t (T::*)() const, JComparison::lt> make_comparator(JResult_t (T::*function)() const)
214 {
216 }
217
218
219 /**
220 * Helper method to create comparator between return values of member method.
221 *
222 * \param function pointer to member method
223 * \param comparator comparator between return values
224 * \return comparator between objects
225 */
226 template<class T, class JResult_t, class JComparator_t>
227 JComparator<JResult_t (T::*)() const, JComparator_t> make_comparator(JResult_t (T::*function)() const,
228 const JComparator_t& comparator)
229 {
230 return JComparator<JResult_t (T::*)() const, JComparator_t>(function, comparator);
231 }
232}
233
234#endif
JComparator(data_member member, const comparator_type &comparator=comparator_type())
Constructor.
bool operator()(const T &first, const T &second) const
Compare objects.
JResult_t T::* data_member
Type definition of data member.
bool operator()(const T &first, typename JClass< JResult_t >::argument_type second) const
Compare object to value.
JComparator_t comparator_type
Type definition of comparator.
JComparator_t comparator_type
Type definition of comparator.
bool operator()(const T &first, const T &second) const
Compare objects.
bool operator()(const T &first, typename JClass< JResult_t >::argument_type second) const
Compare object to value.
JComparator(member_method function, const comparator_type &comparator=comparator_type())
Constructor.
JComparator(member_method function, const comparator_type &comparator=comparator_type())
Constructor.
const T &(T::*) member_method() const
Type definition of member method.
bool operator()(const T &first, const T &second) const
Compare objects.
JComparator_t comparator_type
Type definition of comparator.
Template definition of auxiliary class to compare objects.
Auxiliary classes and methods for language specific functionality.
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
JArgument< T >::argument_type argument_type
Definition JClass.hh:82