48 #ifndef __W_WORKAROUND_H 50 #endif // __W_WORKAROUND_H 53 inline int __umemcmp(
const unsigned char* p,
const unsigned char* q,
int n) {
55 for (i = 0; (i < n) && (*p == *q); i++, p++, q++) {}
56 return (i < n) ? *p - *q : 0;
67 inline uint int_alignment_check(
const void *i)
69 uint tmp = (ptrdiff_t) i & (
sizeof(
int)-1);
70 w_assert9(tmp == (ptrdiff_t) i %
sizeof(
int));
73 inline bool is_int_aligned(
const void *i)
75 return int_alignment_check(i) == 0;
80 inline int umemcmp_smart(
const void* p_,
const void* q_,
int n)
82 const unsigned char* p = (
const unsigned char*)p_;
83 const unsigned char* q = (
const unsigned char*)q_;
86 if (n < (
int)(2*
sizeof(int)))
90 if (int_alignment_check(p) == int_alignment_check(q)) {
91 if (!is_int_aligned(p)) {
98 for (i = 0; i < n/
sizeof(int); i++) {
99 if (((
unsigned*)p)[i] != ((
unsigned*)q)[i]) {
100 return (((
unsigned*)p)[i] > ((
unsigned*)q)[i]) ? 1 : -1;
104 int j = i*
sizeof(int);
113 inline int umemcmp_old(
const void* p,
const void* q,
int n)
115 return __umemcmp((
unsigned char*)p, (
unsigned char*)q, n);
118 inline int umemcmp(
const void* p,
const void* q,
int n)
120 #if W_DEBUG_LEVEL > 2 122 int t1 = umemcmp_smart(p, q, n);
123 int t2 =
__umemcmp((
unsigned char*)p, (
unsigned char*)q, n);
124 assert(t1 == t2 || (t1 < 0 && t2 < 0) || (t1 > 0 && t2 > 0));
127 return umemcmp_smart(p, q, n);
133 inline int umemcmp(
const void* p,
const void* q,
int n) {
134 #if W_DEBUG_LEVEL > 2 136 int t1 = memcmp(p, q, n);
137 int t2 =
__umemcmp((
unsigned char*)p, (
unsigned char*)q, n);
138 w_assert3(t1 == t2 || (t1 < 0 && t2 < 0) || (t1 > 0 && t2 > 0));
141 return memcmp(p, q, n);
149 #endif // __UMEMCMP_H #define w_assert3(x)
Level 3 definitely adds significant time.
Definition: w_base.h:214
int __umemcmp(const unsigned char *p, const unsigned char *q, int n)
Definition: umemcmp.h:53
int umemcmp(const void *p, const void *q, int n)
Definition: umemcmp.h:133
#define w_assert9(x)
changing an assert to an assert9 turns it off.
Definition: w_base.h:243