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 ZFComparerDummy _ZFP_ZFComparerDummy
127template<
typename T_Comparable0,
typename T_Comparable1,
int hasEqual,
int hasSmaller>
131 ZF_IN T_Comparable0
const &v0
132 ,
ZF_IN T_Comparable1
const &v1
137template<
typename T_Comparable0,
typename T_Comparable1>
138zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 1, 1> {
141 ZF_IN T_Comparable0
const &v0
142 ,
ZF_IN T_Comparable1
const &v1
158template<
typename T_Comparable0,
typename T_Comparable1>
159zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 1, 0> {
162 ZF_IN T_Comparable0
const &v0
163 ,
ZF_IN T_Comparable1
const &v1
173template<
typename T_Comparable0,
typename T_Comparable1>
174zfclassNotPOD _ZFP_ZFComparerDefaultImpl<T_Comparable0, T_Comparable1, 0, 1> {
177 ZF_IN T_Comparable0
const &v0
178 ,
ZF_IN T_Comparable1
const &v1
196template<
typename T_Comparable0,
typename T_Comparable1,
197 typename TypeFix0 = void,
typename TypeFix1 = void,
198 typename T_ReservedFix0 = void,
typename T_ReservedFix1 =
void>
208 ZF_IN T_Comparable0
const &v0
209 ,
ZF_IN T_Comparable1
const &v1
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
217template<
typename T_Comparable0,
typename T_Comparable1>
219 ZF_IN T_Comparable0
const &v0
220 ,
ZF_IN T_Comparable1
const &v1
224template<
typename T_Comparable>
226 ZF_IN T_Comparable
const &v0
231template<
typename T_Comparable>
234 ,
ZF_IN T_Comparable
const &v1
250#define ZFComparerDefault _ZFP_ZFComparerDefault
264#define ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, compareAction) \
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 \
273 static ZFCompareResult comparer( \
275 , ZF_IN T1 const &v1 \
290#define ZFCOMPARER_DEFAULT_DECLARE_ALIAS(T_Comparable0, T_Comparable1, compareAction) \
291 ZFCOMPARER_DEFAULT_DECLARE(T_Comparable0, T_Comparable1, {return compareAction(v0, v1);})
296#define ZFCOMPARER_DEFAULT_DECLARE_EXPLICIT(T_Comparable0, T_Comparable1, compareAction) \
299 zfclassNotPOD ZFComparerDefaultHolder<T_Comparable0, T_Comparable1> { \
301 static ZFCompareResult comparer( \
302 ZF_IN T_Comparable0 const &v0 \
303 , ZF_IN T_Comparable1 const &v1 \
318 else if(result > 0) {
326 zfint result = v0.compare(v1);
330 else if(result > 0) {
#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
#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