Use KEYCMPNEGEQ instead of redefining compare functions in RdbBuckets

This commit is contained in:
Ai Lin Chia
2016-09-21 12:33:24 +02:00
parent 8b09f864a2
commit f962753df2

@ -12,84 +12,6 @@
#define INIT_SIZE 4096
#define SAVE_VERSION 0
inline int KEYCMP12 ( const void *a, const void *b ) {
char* k1 = (char*)a;
char* k2 = (char*)b;
if ( (*(uint64_t *)(k1+4)) <
(*(uint64_t *)(k2+4)) ) return -1;
if ( (*(uint64_t *)(k1+4)) >
(*(uint64_t *)(k2+4)) ) return 1;
uint32_t k1n0 = ((*(uint32_t*)(k1)) & ~0x01UL);
uint32_t k2n0 = ((*(uint32_t*)(k2)) & ~0x01UL);
if ( k1n0 < k2n0 ) return -1;
if ( k1n0 > k2n0 ) return 1;
return 0;
}
inline int KEYCMP16 ( const void *a, const void *b ) {
char* k1 = (char*)a;
char* k2 = (char*)b;
if ( (*(uint64_t *)(k1+8)) <
(*(uint64_t *)(k2+8)) ) return -1;
if ( (*(uint64_t *)(k1+8)) >
(*(uint64_t *)(k2+8)) ) return 1;
uint64_t k1n0 = ((*(uint64_t *)(k1)) & ~0x01ULL);
uint64_t k2n0 = ((*(uint64_t *)(k2)) & ~0x01ULL);
if ( k1n0 < k2n0 ) return -1;
if ( k1n0 > k2n0 ) return 1;
return 0;
}
inline int KEYCMP18 ( const void *a, const void *b ) {
char* k1 = (char*)a;
char* k2 = (char*)b;
if ( (*(uint64_t *)(k1+10)) <
(*(uint64_t *)(k2+10)) ) return -1;
if ( (*(uint64_t *)(k1+10)) >
(*(uint64_t *)(k2+10)) ) return 1;
if ( (*(uint64_t *)(k1+2)) <
(*(uint64_t *)(k2+2)) ) return -1;
if ( (*(uint64_t *)(k1+2)) >
(*(uint64_t *)(k2+2)) ) return 1;
uint16_t k1n0 = ((*(uint16_t *)(k1)) & 0xfffe);
uint16_t k2n0 = ((*(uint16_t *)(k2)) & 0xfffe);
if ( k1n0 < k2n0 ) return -1;
if ( k1n0 > k2n0 ) return 1;
return 0;
}
inline int KEYCMP24 ( const void *a, const void *b ) {
char* k1 = (char*)a;
char* k2 = (char*)b;
if ( (*(uint64_t *)(k1+16)) <
(*(uint64_t *)(k2+16)) ) return -1;
if ( (*(uint64_t *)(k1+16)) >
(*(uint64_t *)(k2+16)) ) return 1;
if ( (*(uint64_t *)(k1+8)) <
(*(uint64_t *)(k2+8)) ) return -1;
if ( (*(uint64_t *)(k1+8)) >
(*(uint64_t *)(k2+8)) ) return 1;
uint64_t k1n0 = ((*(uint64_t *)(k1)) & ~0x01ULL);
uint64_t k2n0 = ((*(uint64_t *)(k2)) & ~0x01ULL);
if ( k1n0 < k2n0 ) return -1;
if ( k1n0 > k2n0 ) return 1;
return 0;
}
inline int KEYCMP6 ( const void *a, const void *b ) {
char* k1 = (char*)a;
char* k2 = (char*)b;
if ( (*(uint32_t *)(k1+2)) <
(*(uint32_t *)(k2+2)) ) return -1;
if ( (*(uint32_t *)(k1+2)) >
(*(uint32_t *)(k2+2)) ) return 1;
if ( (*(uint16_t *)(k1+0)) <
(*(uint16_t *)(k2+0)) ) return -1;
if ( (*(uint16_t *)(k1+0)) >
(*(uint16_t *)(k2+0)) ) return 1;
return 0;
}
bool RdbBucket::set(RdbBuckets* parent, char* newbuf) {
m_endKey = NULL;
m_parent = parent;
@ -154,6 +76,35 @@ bool RdbBuckets::hasRoom(int32_t numRecs) const {
return ( m_maxBucketsCapacity - m_numBuckets >= numBucketsRequired );
}
#define CMPFN(ks) \
[](const void *a, const void *b) { \
return static_cast<int>(KEYCMPNEGEQ(static_cast<const char*>(a), static_cast<const char*>(b), ks)); \
};
static int (*getCmpFn(uint8_t ks))(const void*, const void *) {
int (*cmpfn) (const void*, const void *) = NULL;
if (ks == 18) {
cmpfn = CMPFN(18);
} else if (ks == 12) {
cmpfn = CMPFN(12);
} else if (ks == 16) {
cmpfn = CMPFN(16);
} else if (ks == 6) {
cmpfn = CMPFN(6);
} else if (ks == 24) {
cmpfn = CMPFN(24);
} else if (ks == 28) {
cmpfn = CMPFN(28);
} else if (ks == 8) {
cmpfn = CMPFN(8);
} else {
gbshutdownAbort(true);
}
return cmpfn;
}
bool RdbBucket::sort() {
if (m_lastSorted == m_numKeys) {
return true;
@ -168,21 +119,6 @@ bool RdbBucket::sort() {
int32_t recSize = m_parent->getRecSize();
int32_t fixedDataSize = m_parent->getFixedDataSize();
int (*cmpfn) (const void*, const void *) = NULL;
if (ks == 18) {
cmpfn = KEYCMP18;
} else if (ks == 24) {
cmpfn = KEYCMP24;
} else if (ks == 12) {
cmpfn = KEYCMP12;
} else if (ks == 16) {
cmpfn = KEYCMP16;
} else if (ks == 6) {
cmpfn = KEYCMP6;
} else {
gbshutdownAbort(true);
}
char* mergeBuf = m_parent->getSwapBuf();
if (!mergeBuf) {
gbshutdownAbort(true);
@ -202,7 +138,8 @@ bool RdbBucket::sort() {
if (!m_parent->getSortBuf()) {
gbshutdownAbort(true);
}
gbmergesort(list2, numUnsorted, recSize, cmpfn, m_parent->getSortBuf(), m_parent->getSortBufSize());
gbmergesort(list2, numUnsorted, recSize, getCmpFn(ks), m_parent->getSortBuf(), m_parent->getSortBufSize());
char *p = mergeBuf;
char v;