extern int BWTSeqPosHasLocateInfo(const BWTSeq *bwtSeq, Seqpos pos, struct extBitsRetrieval *extBits) { if (bwtSeq->featureToggles & BWTLocateBitmap) { EISRetrieveExtraBits(bwtSeq->seqIdx, pos, EBRF_RETRIEVE_CWBITS, extBits, bwtSeq->hint); return gt_bsGetBit(extBits->cwPart, extBits->cwOffset + pos - extBits->start); } else if (bwtSeq->featureToggles & BWTLocateCount) { BitOffset markOffset = searchLocateCountMark(bwtSeq, pos, extBits); return markOffset != 0; } #ifndef NDEBUG else { fputs("Trying to locate in BWT sequence index without locate information.", stderr); abort(); } #endif return 0; }
int gt_bitPackStringInt8_unit_test(GtError *err) { BitString bitStore = NULL; BitString bitStoreCopy = NULL; uint8_t *randSrc = NULL; /*< create random ints here for input as bit * store */ uint8_t *randCmp = NULL; /*< used for random ints read back */ unsigned *numBitsList = NULL; size_t i, numRnd; BitOffset offsetStart, offset; int had_err = 0; offset = offsetStart = random()%(sizeof (uint8_t) * CHAR_BIT); numRnd = random() % (MAX_RND_NUMS_uint8_t + 1); gt_log_log("offset=%lu, numRnd=%lu\n", (long unsigned)offsetStart, (long unsigned)numRnd); { BitOffset numBits = sizeof (uint8_t) * CHAR_BIT * numRnd + offsetStart; randSrc = gt_malloc(sizeof (uint8_t)*numRnd); bitStore = gt_malloc(bitElemsAllocSize(numBits) * sizeof (BitElem)); bitStoreCopy = gt_calloc(bitElemsAllocSize(numBits), sizeof (BitElem)); randCmp = gt_malloc(sizeof (uint8_t)*numRnd); } /* first test unsigned types */ gt_log_log("gt_bsStoreUInt8/gt_bsGetUInt8: "); for (i = 0; i < numRnd; ++i) { #if 8 > 32 && LONG_BIT < 8 uint8_t v = randSrc[i] = (uint8_t)random() << 32 | random(); #else /* 8 > 32 && LONG_BIT < 8 */ uint8_t v = randSrc[i] = random(); #endif /* 8 > 32 && LONG_BIT < 8 */ int bits = gt_requiredUInt8Bits(v); gt_bsStoreUInt8(bitStore, offset, bits, v); offset += bits; } offset = offsetStart; for (i = 0; i < numRnd; ++i) { uint8_t v = randSrc[i]; int bits = gt_requiredUInt8Bits(v); uint8_t r = gt_bsGetUInt8(bitStore, offset, bits); gt_ensure(had_err, r == v); if (had_err) { gt_log_log("Expected %"PRIu8", got %"PRIu8", i = %lu\n", v, r, (unsigned long)i); freeResourcesAndReturn(had_err); } offset += bits; } gt_log_log("passed\n"); if (numRnd > 0) { uint8_t v = randSrc[0], r = 0; unsigned numBits = gt_requiredUInt8Bits(v); BitOffset i = offsetStart + numBits; uint8_t mask = ~(uint8_t)0; if (numBits < 8) mask = ~(mask << numBits); gt_log_log("bsSetBit, gt_bsClearBit, bsToggleBit, gt_bsGetBit: "); while (v) { int lowBit = v & 1; v >>= 1; gt_ensure(had_err, lowBit == (r = gt_bsGetBit(bitStore, --i))); if (had_err) { gt_log_log("Expected %d, got %d, i = %llu\n", lowBit, (int)r, (unsigned long long)i); freeResourcesAndReturn(had_err); } } i = offsetStart + numBits; gt_bsClear(bitStoreCopy, offsetStart, numBits, random()&1); v = randSrc[0]; while (i) { int lowBit = v & 1; v >>= 1; if (lowBit) bsSetBit(bitStoreCopy, --i); else gt_bsClearBit(bitStoreCopy, --i); } v = randSrc[0]; r = gt_bsGetUInt8(bitStoreCopy, offsetStart, numBits); gt_ensure(had_err, r == v); if (had_err) { gt_log_log("Expected %"PRIu8", got %"PRIu8"\n", v, r); freeResourcesAndReturn(had_err); } for (i = 0; i < numBits; ++i) bsToggleBit(bitStoreCopy, offsetStart + i); r = gt_bsGetUInt8(bitStoreCopy, offsetStart, numBits); gt_ensure(had_err, r == (v = (~v & mask))); if (had_err) { gt_log_log("Expected %"PRIu8", got %"PRIu8"\n", v, r); freeResourcesAndReturn(had_err); } gt_log_log("passed\n"); }