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_ZFComparerForEqual(
116 ZF_IN T_Comparable const &v0
117 , ZF_IN T_Comparable const &v1
118 ) {
119 return v0 == v1 ? ZFCompareEqual : ZFCompareUncomparable;
120}
124#define ZFComparerForEqual _ZFP_ZFComparerForEqual
125
126template<typename T_Comparable>
127inline ZFCompareResult _ZFP_ZFComparerDummy(
128 ZF_IN T_Comparable const &v0
129 , ZF_IN T_Comparable const &v1
130 ) {
132}
136#define ZFComparerDummy _ZFP_ZFComparerDummy
137
138// ============================================================
139template<typename T_Comparable0, typename T_Comparable1, int hasEqual, int hasSmaller>
140zfclassNotPOD _ZFP_ZFComparerDefaultImpl {
141public:
142 static inline ZFCompareResult a(
143 ZF_IN T_Comparable0 const &v0
144 , ZF_IN T_Comparable1 const &v1
145 ) {
147 }
148};
149template<typename T_Comparable0, typename T_Comparable1>
150zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 1, 1> {
151public:
152 static inline ZFCompareResult a(
153 ZF_IN T_Comparable0 const &v0
154 , ZF_IN T_Comparable1 const &v1
155 ) {
156 if(v0 == v1) {
157 return ZFCompareEqual;
158 }
159 else if(v0 < v1) {
160 return ZFCompareSmaller;
161 }
162 else if(v1 < v0) {
163 return ZFCompareGreater;
164 }
165 else {
167 }
168 }
169};
170template<typename T_Comparable0, typename T_Comparable1>
171zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 1, 0> {
172public:
173 static inline ZFCompareResult a(
174 ZF_IN T_Comparable0 const &v0
175 , ZF_IN T_Comparable1 const &v1
176 ) {
177 if(v0 == v1) {
178 return ZFCompareEqual;
179 }
180 else {
182 }
183 }
184};
185template<typename T_Comparable0, typename T_Comparable1>
186zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 0, 1> {
187public:
188 static inline ZFCompareResult a(
189 ZF_IN T_Comparable0 const &v0
190 , ZF_IN T_Comparable1 const &v1
191 ) {
192 if(v0 < v1) {
193 return ZFCompareSmaller;
194 }
195 else if(v1 < v0) {
196 return ZFCompareGreater;
197 }
198 else {
200 }
201 }
202};
208template<typename T_Comparable0, typename T_Comparable1,
209 typename TypeFix0 = void, typename TypeFix1 = void,
210 typename T_ReservedFix0 = void, typename T_ReservedFix1 = void>
212public:
220 ZF_IN T_Comparable0 const &v0
221 , ZF_IN T_Comparable1 const &v1
222 ) {
223 return _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1
224 , _ZFP_ZFComparer::HasEqual<T_Comparable0, T_Comparable1>::Value ? 1 : 0
225 , _ZFP_ZFComparer::HasSmaller<T_Comparable0, T_Comparable1>::Value ? 1 : 0
226 >::a(v0, v1);
227 }
228};
229template<typename T_Comparable0, typename T_Comparable1>
230inline ZFCompareResult _ZFP_ZFComparerDefault(
231 ZF_IN T_Comparable0 const &v0
232 , ZF_IN T_Comparable1 const &v1
233 ) {
235}
236template<typename T_Comparable>
237inline ZFCompareResult _ZFP_ZFComparerDefault(
238 ZF_IN T_Comparable const &v0
239 , ZF_IN zfnullT const &v1
240 ) {
242}
243template<typename T_Comparable>
244inline ZFCompareResult _ZFP_ZFComparerDefault(
245 ZF_IN zfnullT const &v0
246 , ZF_IN T_Comparable const &v1
247 ) {
249}
250inline ZFCompareResult _ZFP_ZFComparerDefault(
251 ZF_IN zfnullT const &v0
252 , ZF_IN zfnullT const &v1
253 ) {
255}
262#define ZFComparerDefault _ZFP_ZFComparerDefault
263
276#define ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, compareAction) \
277 \
278 template<typename T0, typename T1> \
279 zfclassNotPOD ZFComparerDefaultHolder<T0, T1 \
280 , typename zftEnableIf<zftIsTypeOf<T0, T_Comparable0>::Value>::Value \
281 , typename zftEnableIf<zftIsTypeOf<T1, T_Comparable1>::Value>::Value \
282 > \
283 { \
284 public: \
285 static ZFCompareResult comparer( \
286 ZF_IN T0 const &v0 \
287 , ZF_IN T1 const &v1 \
288 ) { \
289 compareAction \
290 } \
291 }; \
292
293
302#define ZFCOMPARER_DEFAULT_DECLARE_ALIAS(T_Comparable0, T_Comparable1, compareAction) \
303 ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, {return compareAction(v0, v1);})
304
308#define ZFCOMPARER_DEFAULT_DECLARE_EXPLICIT(T_Comparable0, T_Comparable1, compareAction) \
309 \
310 template<> \
311 zfclassNotPOD ZFComparerDefaultHolder<T_Comparable0, T_Comparable1> { \
312 public: \
313 static ZFCompareResult comparer( \
314 ZF_IN T_Comparable0 const &v0 \
315 , ZF_IN T_Comparable1 const &v1 \
316 ) { \
317 compareAction \
318 } \
319 }; \
320
321
322// ============================================================
323ZFCOMPARER_DEFAULT_DECLARE(const zfchar *, const zfchar *, {
324 const zfchar *v0Tmp = ((v0 == zfnull) ? "" : v0);
325 const zfchar *v1Tmp = ((v1 == zfnull) ? "" : v1);
326 zfint result = zfscmp(v0Tmp, v1Tmp);
327 if(result < 0) {
328 return ZFCompareSmaller;
329 }
330 else if(result > 0) {
331 return ZFCompareGreater;
332 }
333 else {
334 return ZFCompareEqual;
335 }
336 })
338 zfint result = v0.compare(v1);
339 if(result < 0) {
340 return ZFCompareSmaller;
341 }
342 else if(result > 0) {
343 return ZFCompareGreater;
344 }
345 else {
346 return ZFCompareEqual;
347 }
348 })
349
351
352#endif // #ifndef _ZFI_ZFComparer_h_
353
#define ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, compareAction)
declare a template specialization for ZFComparerDefault
Definition ZFComparer.h:276
_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:184
zfint zfmemcmp(const void *p1, const void *p2, zfindex size)
wrapper to memcmp
Definition ZFCoreTypeDef_ClassType.h:148
#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:211
static ZFCompareResult comparer(T_Comparable0 const &v0, T_Comparable1 const &v1)
default comparer
Definition ZFComparer.h:219
@ Value
std::is_same wrapper
Definition ZFCoreUtilTemplate.h:428