const std::string Sequence::protein_alphabet("AaCcDdEeFfGgHhIiKkLlMmNnPpQqRrSsTtVvWwYy\012\015");
Sequence::Sequence()
- : seq(""),
- header(""),
- species("")
{
}
if ( count == 0)
count = old_seq.size() - start;
- seq.clear();
- seq.reserve(count);
+ boost::shared_ptr<std::string> new_seq(new std::string);
+ new_seq->reserve(count);
// Make a conversion table
// finally, the actual conversion loop
for(std::string::size_type seq_index = 0; seq_index < count; seq_index++)
{
- seq.append(1, conversionTable[ (int)old_seq[seq_index+start]]);
+ new_seq->append(1, conversionTable[ (int)old_seq[seq_index+start]]);
}
+ seq = new_seq;
}
void
if ( count == npos || start+count > size()) {
count = size()-start;
}
- Sequence new_seq(seq.substr(start, count));
+ Sequence new_seq(seq->substr(start, count));
new_seq.set_fasta_header(get_fasta_header());
new_seq.set_species(get_species());
// finally, the actual conversion loop
for(seq_i = len - 1; seq_i >= 0; seq_i--)
{
- table_i = (int) seq.at(seq_i);
+ table_i = (int) seq->at(seq_i);
rev_comp += conversionTable[table_i];
}
std::string Sequence::get_sequence() const
{
- return seq;
+ return *seq;
}
Sequence::const_reference Sequence::operator[](Sequence::size_type i) const
{
- return seq[i];
+ return seq->at(i);
}
-Sequence::const_reference Sequence::at(Sequence::size_type n) const
+Sequence::const_reference Sequence::at(Sequence::size_type i) const
{
- return seq[n];
+ return seq->at(i);
}
void
Sequence::clear()
{
- seq.clear();
+ seq.reset();
header.clear();
species.clear();
annots.clear();
motif_list.clear();
}
-Sequence::iterator Sequence::begin()
-{
- return seq.begin();
-}
Sequence::const_iterator Sequence::begin() const
{
- return seq.begin();
-}
-
-Sequence::iterator Sequence::end()
-{
- return seq.end();
+ if (seq)
+ return seq->begin();
+ else
+ return Sequence::const_iterator(0);
}
Sequence::const_iterator Sequence::end() const
{
- return seq.end();
+ if (seq)
+ return seq->end();
+ else
+ return Sequence::const_iterator(0);
}
bool Sequence::empty() const
{
- return seq.empty();
+ if (seq)
+ return seq->empty();
+ else
+ return true;
}
Sequence::size_type Sequence::size() const
{
- return seq.size();
+ if (seq)
+ return seq->size();
+ else
+ return 0;
}
Sequence::size_type Sequence::length() const
seq_counter++;
}
getline(load_file, file_data_line);
- seq.assign(file_data_line);
+ // looks like the sequence is written as a single line
+ set_filtered_sequence(file_data_line);
getline(load_file, file_data_line);
getline(load_file, file_data_line);
if (file_data_line == "<Annotations>")
void
Sequence::motif_scan(std::string a_motif, std::vector<int> * motif_match_starts) const
{
- std::string::const_iterator seq_c = seq.begin();
+ std::string::const_iterator seq_c = seq->begin();
std::string::size_type seq_i;
int motif_i, motif_len;
bool operator==(const Sequence& x, const Sequence& y)
{
- if (x.seq == y.seq and x.annots == y.annots and x.motif_list == y.motif_list) {
+ if (x.empty() and y.empty()) {
+ // if there's no sequence in either sequence structure, they're equal
+ return true;
+ } else if (x.empty() or y.empty()) {
+ // if we fail the first test, and we discover one is empty,
+ // we know they can't be equal. (and we need to do this
+ // to prevent dereferencing an empty pointer)
+ return false;
+ } else if ( *(x.seq) == *(y.seq)) {
+ // and x.annots == y.annots and x.motif_list == y.motif_list) {
return true;
} else {
return false;