Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JMultiComparable.hh
Go to the documentation of this file.
1#ifndef __JLANG__JMULTICOMPARABLE__
2#define __JLANG__JMULTICOMPARABLE__
3
4#include "JLang/JNullType.hh"
5#include "JLang/JTypeList.hh"
6#include "JLang/JType.hh"
7
8
9/**
10 * \author mdejong
11 */
12
13namespace JLANG {}
14namespace JPP { using namespace JLANG; }
15
16namespace JLANG {
17
18
19 /**
20 * Template definition of auxiliary base class for composite data structures
21 * composed of base classes with comparisons capabilities.
22 *
23 * Each data type <tt>T</tt> in the type list should have the corresponding operator:
24 * <pre>
25 * bool operator<(const T&, const T& second);
26 * </pre>
27 * This class uses in-class friend operators (see Barton-Nackman trick).
28 *
29 * This class implements the operators <tt> < > <= >= == != </tt>.
30 */
31 template<class JClass_t, class JTypelist_t>
33 protected:
34 /**
35 * Less than method for composite data types.
36 *
37 * \param first first object
38 * \param second second object
39 * \param type type
40 * \return true if first object is less than second object; else false
41 */
42 template<class JHead_t, class JTail_t>
43 static inline bool lt(const JClass_t& first,
44 const JClass_t& second,
46 {
47 if (static_cast<const JHead_t&>(first) <
48 static_cast<const JHead_t&>(second))
49 return true;
50 else if (static_cast<const JHead_t&>(second) <
51 static_cast<const JHead_t&>(first))
52 return false;
53 else
54 return lt(first, second, JType<JTail_t>());
55 }
56
57
58 /**
59 * Less than method for composite data types.
60 *
61 * \param first first object
62 * \param second second object
63 * \param type type
64 * \return true if first object is less than second object; else false
65 */
66 template<class JHead_t>
67 static inline bool lt(const JClass_t& first,
68 const JClass_t& second,
70 {
71 return (static_cast<const JHead_t&>(first) <
72 static_cast<const JHead_t&>(second));
73 }
74
75 public:
76 /**
77 * Less than operator.
78 *
79 * \param first first object
80 * \param second second object
81 * \return true if first object is less than second object; else false
82 */
83 friend bool operator<(const JClass_t& first,
84 const JClass_t& second)
85 {
86 return lt(first, second, JType<JTypelist_t>());
87 }
88
89
90 /**
91 * Greater than operator.
92 *
93 * \param first first object
94 * \param second second object
95 * \return true if first object is greater than second object; else false
96 */
97 friend bool operator>(const JClass_t& first,
98 const JClass_t& second)
99 {
100 return lt(second, first, JType<JTypelist_t>());
101 }
102
103
104 /**
105 * Less than or equal operator.
106 *
107 * \param first first object
108 * \param second second object
109 * \return true if first object is less than or equal to second object; else false
110 */
111 friend bool operator<=(const JClass_t& first,
112 const JClass_t& second)
113 {
114 return !lt(second, first, JType<JTypelist_t>());
115 }
116
117
118 /**
119 * Greater than or equal operator.
120 *
121 * \param first first object
122 * \param second second object
123 * \return true if first object is greater than or equal to second object; else false
124 */
125 friend bool operator>=(const JClass_t& first,
126 const JClass_t& second)
127 {
128 return !lt(first, second, JType<JTypelist_t>());
129 }
130
131
132 /**
133 * Equal operator.
134 *
135 * \param first first object
136 * \param second second object
137 * \return true if two objects are equal; else false
138 */
139 friend bool operator==(const JClass_t& first,
140 const JClass_t& second)
141 {
142 return (!lt(first, second, JType<JTypelist_t>()) &&
143 !lt(second, first, JType<JTypelist_t>()));
144 }
145
146
147 /**
148 * Not equal operator.
149 *
150 * \param first first object
151 * \param second second object
152 * \return true if two objects are not equal; else false
153 */
154 friend bool operator!=(const JClass_t& first,
155 const JClass_t& second)
156 {
157 return (lt(first, second, JType<JTypelist_t>()) ||
158 lt(second, first, JType<JTypelist_t>()));
159 }
160 };
161}
162
163#endif
Auxiliary classes and methods for language specific functionality.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Template definition of auxiliary base class for composite data structures composed of base classes wi...
friend bool operator==(const JClass_t &first, const JClass_t &second)
Equal operator.
static bool lt(const JClass_t &first, const JClass_t &second, const JType< JTypeList< JHead_t, JTail_t > > &type)
Less than method for composite data types.
friend bool operator<=(const JClass_t &first, const JClass_t &second)
Less than or equal operator.
friend bool operator>(const JClass_t &first, const JClass_t &second)
Greater than operator.
static bool lt(const JClass_t &first, const JClass_t &second, const JType< JTypeList< JHead_t, JNullType > > &type)
Less than method for composite data types.
friend bool operator!=(const JClass_t &first, const JClass_t &second)
Not equal operator.
friend bool operator>=(const JClass_t &first, const JClass_t &second)
Greater than or equal operator.
friend bool operator<(const JClass_t &first, const JClass_t &second)
Less than operator.
Type list.
Definition JTypeList.hh:23
Auxiliary class for a type holder.
Definition JType.hh:19