1 //
2 // Created by mad on 12/14/15.
3 //
4 #include <new>
5 #include <cstring>
6 #include <sys/mman.h>
7 #include "Debug.h"
8 #include "Util.h"
9 #include "SequenceLookup.h"
10 
SequenceLookup(size_t sequenceCount,size_t dataSize)11 SequenceLookup::SequenceLookup(size_t sequenceCount, size_t dataSize)
12         : sequenceCount(sequenceCount), dataSize(dataSize), currentIndex(0), currentOffset(0), externalData(false) {
13     data = new(std::nothrow) char[dataSize + 1];
14     Util::checkAllocation(data, "Can not allocate data memory in SequenceLookup");
15 
16     offsets = new(std::nothrow) size_t[sequenceCount + 1];
17     Util::checkAllocation(offsets, "Can not allocate offsets memory in SequenceLookup");
18     offsets[sequenceCount] = dataSize;
19 }
20 
SequenceLookup(size_t sequenceCount)21 SequenceLookup::SequenceLookup(size_t sequenceCount)
22         : sequenceCount(sequenceCount), data(NULL), dataSize(0), offsets(NULL), currentIndex(0), currentOffset(0), externalData(true) {
23 }
24 
~SequenceLookup()25 SequenceLookup::~SequenceLookup() {
26     if(externalData == false){
27         delete[] data;
28         delete[] offsets;
29     }
30 }
31 
addSequence(unsigned char * seq,int L,size_t index,size_t offset)32 void SequenceLookup::addSequence(unsigned char *seq, int L, size_t index, size_t offset){
33     offsets[index] = offset;
34     memcpy(&data[offset], seq, L);
35 }
36 
addSequence(Sequence * seq)37 void SequenceLookup::addSequence(Sequence *seq) {
38     addSequence(seq->numSequence, seq->L, currentIndex, currentOffset);
39     currentIndex = currentIndex + 1;
40     currentOffset = currentOffset + seq->L;
41 }
42 
getSequence(size_t id)43 std::pair<const unsigned char *, const unsigned int> SequenceLookup::getSequence(size_t id) {
44     ptrdiff_t N = offsets[id + 1] - offsets[id];
45     char *p = data + offsets[id];
46     return std::pair<const unsigned char *, const unsigned int>(reinterpret_cast<const unsigned char*>(p), static_cast<unsigned int>(N));
47 }
48 
getData()49 const char *SequenceLookup::getData() {
50     return data;
51 }
52 
getDataSize()53 int64_t SequenceLookup::getDataSize() {
54     return dataSize;
55 }
56 
getOffsets()57 size_t *SequenceLookup::getOffsets() {
58     return offsets;
59 }
60 
getSequenceCount()61 size_t SequenceLookup::getSequenceCount() {
62     return sequenceCount;
63 }
64 
initLookupByExternalData(char * seqData,size_t seqDataSize,size_t * seqOffsets)65 void SequenceLookup::initLookupByExternalData(char *seqData, size_t seqDataSize, size_t *seqOffsets) {
66     dataSize = seqDataSize;
67 
68     data = seqData;
69     offsets = seqOffsets;
70 }
71 
initLookupByExternalDataCopy(char * seqData,size_t * seqOffsets)72 void SequenceLookup::initLookupByExternalDataCopy(char *seqData, size_t *seqOffsets) {
73     memcpy(data, seqData, (dataSize + 1) * sizeof(char));
74     memcpy(offsets, seqOffsets, (sequenceCount + 1) * sizeof(size_t));
75 }
76