6#ifndef _ZFI_ZFComparer_h_
7#define _ZFI_ZFComparer_h_
14namespace _ZFP_ZFComparer {
16#pragma GCC diagnostic push
17#pragma GCC diagnostic ignored "-Wnonnull"
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);
27 template<
typename T>
class _remove_pointer {
public:
typedef T Type;};
28 template<
typename T>
class _remove_pointer<T *> {
public:
typedef T Type;};
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}; };
36 template <
class _Tp>
struct _is_const {
public:
enum {Value = 0}; };
37 template <
class _Tp>
struct _is_const<_Tp const> {
public:
enum {Value = 1}; };
39 template <
class _Tp>
struct _is_function {
public:
enum {Value = !(_is_reference<_Tp>::Value || _is_const<const _Tp>::Value) ? 1 : 0 };};
41 template <
typename T,
typename Arg = T>
45 Value = (
sizeof(_ck(*(T *)(0) == *(Arg *)(0))) !=
sizeof(No)) ? 1 : 0,
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
55 Value = (sizeof(_ck(*(T *)(0) < *(Arg *)(0))) != sizeof(No)) ? 1 : 0,
58 template <
typename T,
typename Arg>
59 class HasSmaller<T, Arg, 1> {
65 template <
typename T,
int isFunc>
66 class HasSmaller<T,
zfnullT, isFunc> {
72 template <
typename T,
int isFunc>
73 class HasSmaller<
zfnullT, T, isFunc> {
88#pragma GCC diagnostic pop
93template<
typename T_Comparable>
95 ZF_IN T_Comparable
const &v0
96 ,
ZF_IN T_Comparable
const &v1
102 else if(result > 0) {
112#define ZFComparerForPOD _ZFP_ZFComparerForPOD
114template<
typename T_Comparable>
116 ZF_IN T_Comparable
const &v0
117 ,
ZF_IN T_Comparable
const &v1
124#define ZFComparerForEqual _ZFP_ZFComparerForEqual
126template<
typename T_Comparable>
128 ZF_IN T_Comparable
const &v0
129 ,
ZF_IN T_Comparable
const &v1
136#define ZFComparerDummy _ZFP_ZFComparerDummy
139template<
typename T_Comparable0,
typename T_Comparable1,
int hasEqual,
int hasSmaller>
143 ZF_IN T_Comparable0
const &v0
144 ,
ZF_IN T_Comparable1
const &v1
149template<
typename T_Comparable0,
typename T_Comparable1>
150zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 1, 1> {
153 ZF_IN T_Comparable0
const &v0
154 ,
ZF_IN T_Comparable1
const &v1
170template<
typename T_Comparable0,
typename T_Comparable1>
171zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 1, 0> {
174 ZF_IN T_Comparable0
const &v0
175 ,
ZF_IN T_Comparable1
const &v1
185template<
typename T_Comparable0,
typename T_Comparable1>
186zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 0, 1> {
189 ZF_IN T_Comparable0
const &v0
190 ,
ZF_IN T_Comparable1
const &v1
208template<
typename T_Comparable0,
typename T_Comparable1,
209 typename TypeFix0 = void,
typename TypeFix1 = void,
210 typename T_ReservedFix0 = void,
typename T_ReservedFix1 =
void>
220 ZF_IN T_Comparable0
const &v0
221 ,
ZF_IN T_Comparable1
const &v1
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
229template<
typename T_Comparable0,
typename T_Comparable1>
231 ZF_IN T_Comparable0
const &v0
232 ,
ZF_IN T_Comparable1
const &v1
236template<
typename T_Comparable>
238 ZF_IN T_Comparable
const &v0
243template<
typename T_Comparable>
246 ,
ZF_IN T_Comparable
const &v1
262#define ZFComparerDefault _ZFP_ZFComparerDefault
276#define ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, compareAction) \
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 \
285 static ZFCompareResult comparer( \
287 , ZF_IN T1 const &v1 \
302#define ZFCOMPARER_DEFAULT_DECLARE_ALIAS(T_Comparable0, T_Comparable1, compareAction) \
303 ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, {return compareAction(v0, v1);})
308#define ZFCOMPARER_DEFAULT_DECLARE_EXPLICIT(T_Comparable0, T_Comparable1, compareAction) \
311 zfclassNotPOD ZFComparerDefaultHolder<T_Comparable0, T_Comparable1> { \
313 static ZFCompareResult comparer( \
314 ZF_IN T_Comparable0 const &v0 \
315 , ZF_IN T_Comparable1 const &v1 \
330 else if(result > 0) {
338 zfint result = v0.compare(v1);
342 else if(result > 0) {
#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
#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