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