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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include <iostream>
#include <vector>
#include <map>
#include <algorithm>
enum Nucleotide : char
{
AMINE = 0x01,
KETONE = 0x02,
PURINE = 0x04,
PYRIMIDINE = 0x08,
COMPLEMENT = 0x0f,
A = AMINE | PURINE,
C = AMINE | PYRIMIDINE,
G = KETONE | PURINE,
T = KETONE | PYRIMIDINE
};
inline const Nucleotide operator ^=(Nucleotide &x, const Nucleotide y)
{
return x = static_cast<Nucleotide>(x ^ y);
}
inline const Nucleotide operator ^(Nucleotide x, const Nucleotide y)
{
return x ^= y;
}
inline std::ostream &operator <<(std::ostream &os, const Nucleotide n)
{
static const std::map<Nucleotide, char> MAPPING
{{
{A, 'A'},
{C, 'C'},
{G, 'G'},
{T, 'T'}
}};
return os << MAPPING.at(n);
}
class Sequence
{
private:
std::vector<Nucleotide> sequence;
public:
Sequence(const std::vector<Nucleotide> &sequence) :
sequence(sequence)
{
}
void reverse()
{
std::reverse(sequence.begin(), sequence.end());
}
void complement()
{
for (auto &n : sequence)
{
n ^= COMPLEMENT;
}
}
friend std::ostream &operator <<(std::ostream &os, const Sequence &s)
{
for (const auto n : s.sequence)
{
os << n;
}
return os;
}
};
int main()
{
Sequence sequence{{A, G, C, T, G, T, A, C}};
std::cout << "Sequence de base : " << sequence << std::endl;
Sequence sequence2 = sequence;
sequence.reverse();
std::cout << "Inverse : " << sequence << std::endl;
sequence2.complement();
std::cout << "Complement : " << sequence2 << std::endl;
Nucleotide complement = A ^ COMPLEMENT;
std::cout << "Complement de " << A << " : " << complement << std::endl;
return 0;
} |