ZFFramework
 
Loading...
Searching...
No Matches
ZFComparer.h
Go to the documentation of this file.
1
5
6#ifndef _ZFI_ZFComparer_h_
7#define _ZFI_ZFComparer_h_
8
10
12
13// ============================================================
14namespace _ZFP_ZFComparer {
15#if defined(__GNUC__)
16#pragma GCC diagnostic push
17#pragma GCC diagnostic ignored "-Wnonnull"
18#endif
19
20 class No { bool b[2]; };
21 template<typename T, typename Arg> No operator == (T, Arg);
22 template<typename T, typename Arg> No operator < (T, Arg);
23
24 bool _ck(...);
25 No &_ck(const No &);
26
27 template<typename T> class _remove_pointer {public: typedef T Type;};
28 template<typename T> class _remove_pointer<T *> {public: typedef T Type;};
29
30 template <class _Tp> struct _is_reference {public: enum {Value = 0}; };
31 template <class _Tp> struct _is_reference<_Tp&> {public: enum {Value = 1}; };
32 #if defined(__cplusplus) && (__cplusplus >= 201103L)
33 template <class _Tp> struct _is_reference<_Tp&&> {public: enum {Value = 1}; };
34 #endif
35
36 template <class _Tp> struct _is_const {public: enum {Value = 0}; };
37 template <class _Tp> struct _is_const<_Tp const> {public: enum {Value = 1}; };
38
39 template <class _Tp> struct _is_function {public: enum {Value = !(_is_reference<_Tp>::Value || _is_const<const _Tp>::Value) ? 1 : 0 };};
40
41 template <typename T, typename Arg = T>
42 class HasEqual {
43 public:
44 enum {
45 Value = (sizeof(_ck(*(T *)(0) == *(Arg *)(0))) != sizeof(No)) ? 1 : 0,
46 };
47 };
48 template <typename T, typename Arg = T, int isFunc =
49 (_is_function<typename _remove_pointer<T>::Type>::Value
50 || _is_function<typename _remove_pointer<Arg>::Type>::Value) ? 1 : 0
51 >
52 class HasSmaller {
53 public:
54 enum {
55 Value = (sizeof(_ck(*(T *)(0) < *(Arg *)(0))) != sizeof(No)) ? 1 : 0,
56 };
57 };
58 template <typename T, typename Arg>
59 class HasSmaller<T, Arg, 1> {
60 public:
61 enum {
62 Value = 0,
63 };
64 };
65 template <typename T, int isFunc>
66 class HasSmaller<T, zfnullT, isFunc> {
67 public:
68 enum {
69 Value = 0,
70 };
71 };
72 template <typename T, int isFunc>
73 class HasSmaller<zfnullT, T, isFunc> {
74 public:
75 enum {
76 Value = 0,
77 };
78 };
79 template <int isFunc>
80 class HasSmaller<zfnullT, zfnullT, isFunc> {
81 public:
82 enum {
84 };
85 };
86
87#if defined(__GNUC__)
88#pragma GCC diagnostic pop
89#endif
90}
91
92// ============================================================
93template<typename T_Comparable>
94inline ZFCompareResult _ZFP_ZFComparerForPOD(
95 ZF_IN T_Comparable const &v0
96 , ZF_IN T_Comparable const &v1
97 ) {
98 zfint result = zfmemcmp(&v0, &v1, sizeof(T_Comparable));
99 if(result < 0) {
100 return ZFCompareSmaller;
101 }
102 else if(result > 0) {
103 return ZFCompareGreater;
104 }
105 else {
106 return ZFCompareEqual;
107 }
108}
112#define ZFComparerForPOD _ZFP_ZFComparerForPOD
113
114template<typename T_Comparable>
115inline ZFCompareResult _ZFP_ZFComparerDummy(
116 ZF_IN T_Comparable const &v0
117 , ZF_IN T_Comparable const &v1
118 ) {
120}
124#define ZFComparerDummy _ZFP_ZFComparerDummy
125
126// ============================================================
127template<typename T_Comparable0, typename T_Comparable1, int hasEqual, int hasSmaller>
128zfclassNotPOD _ZFP_ZFComparerDefaultImpl {
129public:
130 static inline ZFCompareResult a(
131 ZF_IN T_Comparable0 const &v0
132 , ZF_IN T_Comparable1 const &v1
133 ) {
135 }
136};
137template<typename T_Comparable0, typename T_Comparable1>
138zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 1, 1> {
139public:
140 static inline ZFCompareResult a(
141 ZF_IN T_Comparable0 const &v0
142 , ZF_IN T_Comparable1 const &v1
143 ) {
144 if(v0 == v1) {
145 return ZFCompareEqual;
146 }
147 else if(v0 < v1) {
148 return ZFCompareSmaller;
149 }
150 else if(v1 < v0) {
151 return ZFCompareGreater;
152 }
153 else {
155 }
156 }
157};
158template<typename T_Comparable0, typename T_Comparable1>
159zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 1, 0> {
160public:
161 static inline ZFCompareResult a(
162 ZF_IN T_Comparable0 const &v0
163 , ZF_IN T_Comparable1 const &v1
164 ) {
165 if(v0 == v1) {
166 return ZFCompareEqual;
167 }
168 else {
170 }
171 }
172};
173template<typename T_Comparable0, typename T_Comparable1>
174zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 0, 1> {
175public:
176 static inline ZFCompareResult a(
177 ZF_IN T_Comparable0 const &v0
178 , ZF_IN T_Comparable1 const &v1
179 ) {
180 if(v0 < v1) {
181 return ZFCompareSmaller;
182 }
183 else if(v1 < v0) {
184 return ZFCompareGreater;
185 }
186 else {
188 }
189 }
190};
196template<typename T_Comparable0, typename T_Comparable1,
197 typename TypeFix0 = void, typename TypeFix1 = void,
198 typename T_ReservedFix0 = void, typename T_ReservedFix1 = void>
200public:
208 ZF_IN T_Comparable0 const &v0
209 , ZF_IN T_Comparable1 const &v1
210 ) {
211 return _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1
212 , _ZFP_ZFComparer::HasEqual<T_Comparable0, T_Comparable1>::Value ? 1 : 0
213 , _ZFP_ZFComparer::HasSmaller<T_Comparable0, T_Comparable1>::Value ? 1 : 0
214 >::a(v0, v1);
215 }
216};
217template<typename T_Comparable0, typename T_Comparable1>
218inline ZFCompareResult _ZFP_ZFComparerDefault(
219 ZF_IN T_Comparable0 const &v0
220 , ZF_IN T_Comparable1 const &v1
221 ) {
223}
224template<typename T_Comparable>
225inline ZFCompareResult _ZFP_ZFComparerDefault(
226 ZF_IN T_Comparable const &v0
227 , ZF_IN zfnullT const &v1
228 ) {
230}
231template<typename T_Comparable>
232inline ZFCompareResult _ZFP_ZFComparerDefault(
233 ZF_IN zfnullT const &v0
234 , ZF_IN T_Comparable const &v1
235 ) {
237}
238inline ZFCompareResult _ZFP_ZFComparerDefault(
239 ZF_IN zfnullT const &v0
240 , ZF_IN zfnullT const &v1
241 ) {
243}
250#define ZFComparerDefault _ZFP_ZFComparerDefault
251
264#define ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, compareAction) \
265 \
266 template<typename T0, typename T1> \
267 zfclassNotPOD ZFComparerDefaultHolder<T0, T1 \
268 , typename zftEnableIf<zftIsTypeOf<T0, T_Comparable0>::Value>::Value \
269 , typename zftEnableIf<zftIsTypeOf<T1, T_Comparable1>::Value>::Value \
270 > \
271 { \
272 public: \
273 static ZFCompareResult comparer( \
274 ZF_IN T0 const &v0 \
275 , ZF_IN T1 const &v1 \
276 ) { \
277 compareAction \
278 } \
279 }; \
280
281
290#define ZFCOMPARER_DEFAULT_DECLARE_ALIAS(T_Comparable0, T_Comparable1, compareAction) \
291 ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, {return compareAction(v0, v1);})
292
296#define ZFCOMPARER_DEFAULT_DECLARE_EXPLICIT(T_Comparable0, T_Comparable1, compareAction) \
297 \
298 template<> \
299 zfclassNotPOD ZFComparerDefaultHolder<T_Comparable0, T_Comparable1> { \
300 public: \
301 static ZFCompareResult comparer( \
302 ZF_IN T_Comparable0 const &v0 \
303 , ZF_IN T_Comparable1 const &v1 \
304 ) { \
305 compareAction \
306 } \
307 }; \
308
309
310// ============================================================
311ZFCOMPARER_DEFAULT_DECLARE(const zfchar *, const zfchar *, {
312 const zfchar *v0Tmp = ((v0 == zfnull) ? "" : v0);
313 const zfchar *v1Tmp = ((v1 == zfnull) ? "" : v1);
314 zfint result = zfscmp(v0Tmp, v1Tmp);
315 if(result < 0) {
316 return ZFCompareSmaller;
317 }
318 else if(result > 0) {
319 return ZFCompareGreater;
320 }
321 else {
322 return ZFCompareEqual;
323 }
324 })
326 zfint result = v0.compare(v1);
327 if(result < 0) {
328 return ZFCompareSmaller;
329 }
330 else if(result > 0) {
331 return ZFCompareGreater;
332 }
333 else {
334 return ZFCompareEqual;
335 }
336 })
337
339
340#endif // #ifndef _ZFI_ZFComparer_h_
341
#define ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, compareAction)
declare a template specialization for ZFComparerDefault
Definition ZFComparer.h:264
_ZFT_t_zfchar zfchar
char wrapper
Definition ZFCoreTypeDef_CharType.h:17
zfint zfscmp(const zfchar *s1, const zfchar *s2)
strcmp wrapper as zfchar type
Definition ZFCoreTypeDef_CharType.h:152
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:180
zfint zfmemcmp(const void *p1, const void *p2, zfindex size)
wrapper to memcmp
Definition ZFCoreTypeDef_ClassType.h:144
#define zfclassNotPOD
shows the class is not a POD type, you should not memset it or declare it in stack or copy value by c...
Definition ZFCoreTypeDef_ClassType.h:48
#define zfnullT
type for zfnull, can be used for function overload
Definition ZFCoreTypeDef_CoreType.h:85
_ZFT_t_zfint zfint
same as int, see zfindex
Definition ZFCoreTypeDef_CoreType.h:165
#define zfnull
same as NULL, defined for future use
Definition ZFCoreTypeDef_CoreType.h:88
ZFCompareResult
compare result of two ZFObjects
Definition ZFCoreTypeDef_OtherType.h:28
@ ZFCompareSmaller
Definition ZFCoreTypeDef_OtherType.h:30
@ ZFCompareUncomparable
Definition ZFCoreTypeDef_OtherType.h:29
@ ZFCompareEqual
Definition ZFCoreTypeDef_OtherType.h:31
@ ZFCompareGreater
Definition ZFCoreTypeDef_OtherType.h:32
zft_zfstring< zfchar > zfstring
see zft_zfstring
Definition ZFCoreTypeDef_StringType.h:15
template utils
#define ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98
comparer holder fo ZFComparerDefault, you may specialize this class to supply your custom type's comp...
Definition ZFComparer.h:199
static ZFCompareResult comparer(T_Comparable0 const &v0, T_Comparable1 const &v1)
default comparer
Definition ZFComparer.h:207
@ Value
std::is_same wrapper
Definition ZFCoreUtilTemplate.h:426