/** * @param alphabet ownership of alphabet is with the newly produced * sequence object if return value is non-NULL */ BWTSeq * gt_newBWTSeq(EISeq *seqIdx, MRAEnc *alphabet, const enum rangeSortMode *defaultRangeSort) { BWTSeq *bwtSeq; GtUword *counts; size_t countsOffset, rangeSortOffset, totalSize; enum rangeSortMode *rangeSort; unsigned alphabetSize; gt_assert(seqIdx); /* alphabetSize is increased by one to handle the flattened * terminator symbol correctly */ alphabetSize = gt_MRAEncGetSize(alphabet) + 1; countsOffset = offsetAlign(sizeof (struct BWTSeq), sizeof (GtUword)); rangeSortOffset = offsetAlign(countsOffset + sizeof (GtUword) * (alphabetSize + 1), sizeof (enum rangeSortMode)); totalSize = rangeSortOffset + sizeof (enum rangeSortMode) * MRAEncGetNumRanges(alphabet); bwtSeq = gt_malloc(totalSize); bwtSeq->pckbuckettable = NULL; counts = (GtUword *)((char *)bwtSeq + countsOffset); rangeSort = (enum rangeSortMode *)((char *)bwtSeq + rangeSortOffset); if (!initBWTSeqFromEncSeqIdx(bwtSeq, seqIdx, alphabet, counts, rangeSort, defaultRangeSort)) { gt_free(bwtSeq); bwtSeq = NULL; } return bwtSeq; }
MRAEnc * gt_newMultiRangeAlphabetEncodingUInt8(AlphabetRangeID numRanges, const AlphabetRangeSize symbolsPerRange[], const uint8_t *mappings) { MRAEncUInt8 *newAlpha = NULL; size_t rEIOffset = offsetAlign( sizeof (MRAEncUInt8), sizeof (newAlpha->baseClass.rangeEndIndices[0])); size_t sPROffset = offsetAlign( rEIOffset + sizeof (newAlpha->baseClass.rangeEndIndices[0]) * numRanges, sizeof (newAlpha->baseClass.symbolsPerRange[0])); AlphabetRangeID i; if ((newAlpha = gt_calloc( sPROffset + sizeof (newAlpha->baseClass.symbolsPerRange[0]) * numRanges, 1))) { newAlpha->baseClass.rangeEndIndices = (AlphabetRangeSize *)((char *)newAlpha + rEIOffset); newAlpha->baseClass.symbolsPerRange = (AlphabetRangeSize *)((char *)newAlpha + sPROffset); newAlpha->baseClass.encType = sourceUInt8; newAlpha->baseClass.numRanges = numRanges; memset(newAlpha->mappings, UNDEF_UCHAR, UINT8_MAX+1); memset(newAlpha->revMappings, UNDEF_UCHAR, UINT8_MAX+1); newAlpha->baseClass.rangeEndIndices[0] = newAlpha->baseClass.symbolsPerRange[0] = symbolsPerRange[0]; for (i = 1; i < numRanges; ++i) { newAlpha->baseClass.rangeEndIndices[i] = newAlpha->baseClass.rangeEndIndices[i-1] + (newAlpha->baseClass.symbolsPerRange[i] = symbolsPerRange[i]); } for (i = 0; i <= UINT8_MAX; ++i) { newAlpha->mappings[i] = mappings[i]; newAlpha->revMappings[mappings[i]] = i; } } else { if (newAlpha) { if (newAlpha->baseClass.symbolsPerRange) gt_free(newAlpha->baseClass.symbolsPerRange); if (newAlpha->baseClass.rangeEndIndices) gt_free(newAlpha->baseClass.rangeEndIndices); gt_free(newAlpha); } return NULL; } return &(newAlpha->baseClass); }