// SamSequenceDictionary.cpp (c) 2010 Derek Barnett
// Marth Lab, Department of Biology, Boston College
// ---------------------------------------------------------------------------
-// Last modified: 12 October 2011 (DB)
+// Last modified: 16 October 2011 (DB)
// ---------------------------------------------------------------------------
// Provides methods for operating on a collection of SamSequence entries.
// *************************************************************************
Provides methods for operating on a collection of SamSequence entries.
*/
-/*! \typedef BamTools::SamSequenceIterator
- \brief mutable iterator for SamSequenceDictionary data
-
- \note This iterator, dereferenced, points to a std::pair<std::string, SamSequence>, NOT
- a "plain old" SamSequence. To retrieve the sequence:
-
- \code
- SamSequenceIterator iter;
- SamSequence& sq = (*iter).second // OR iter->second;
- \endcode
-*/
-
-/*! \typedef BamTools::SamSequenceConstIterator
- \brief const iterator for SamSequenceDictionary data
-
- \note This iterator, dereferenced, points to a std::pair<std::string, SamSequence>, NOT
- a "plain old" SamSequence. To retrieve the sequence:
-
- \code
- SamSequenceConstIterator iter;
- const SamSequence& sq = (*iter).second // OR iter->second;
- \endcode
-*/
-
/*! \fn SamSequenceDictionary::SamSequenceDictionary(void)
\brief constructor
*/
*/
SamSequenceDictionary::SamSequenceDictionary(const SamSequenceDictionary& other)
: m_data(other.m_data)
+ , m_lookupData(other.m_lookupData)
{ }
/*! \fn SamSequenceDictionary::~SamSequenceDictionary(void)
\param[in] sequence entry to be added
*/
void SamSequenceDictionary::Add(const SamSequence& sequence) {
- if ( IsEmpty() || !Contains(sequence) )
- m_data[sequence.Name] = sequence;
+ if ( IsEmpty() || !Contains(sequence) ) {
+ m_data.push_back(sequence);
+ m_lookupData[sequence.Name] = m_data.size() - 1;
+ }
}
/*! \fn void SamSequenceDictionary::Add(const std::string& name, const int& length)
SamSequenceConstIterator seqIter = sequences.ConstBegin();
SamSequenceConstIterator seqEnd = sequences.ConstEnd();
for ( ; seqIter != seqEnd; ++seqIter )
- Add(seqIter->second);
+ Add(*seqIter);
}
/*! \fn void SamSequenceDictionary::Add(const std::vector<SamSequence>& sequences)
*/
void SamSequenceDictionary::Clear(void) {
m_data.clear();
+ m_lookupData.clear();
}
/*! \fn SamSequenceConstIterator SamSequenceDictionary::ConstBegin(void) const
\return \c true if dictionary contains a sequence with this name
*/
bool SamSequenceDictionary::Contains(const std::string& sequenceName) const {
- return ( m_data.find(sequenceName) != m_data.end() );
+ return ( m_lookupData.find(sequenceName) != m_lookupData.end() );
}
/*! \fn bool SamSequenceDictionary::Contains(const SamSequence& sequence) const
\sa Remove()
*/
void SamSequenceDictionary::Remove(const std::string& sequenceName) {
- m_data.erase(sequenceName);
+
+ // skip if empty dictionary or if name unknown
+ if ( IsEmpty() || !Contains(sequenceName) )
+ return;
+
+ // update 'lookup index' for every entry after @sequenceName
+ const size_t indexToRemove = m_lookupData[sequenceName];
+ const size_t numEntries = m_data.size();
+ for ( size_t i = indexToRemove+1; i < numEntries; ++i ) {
+ const SamSequence& sq = m_data.at(i);
+ --m_lookupData[sq.Name];
+ }
+
+ // erase entry from containers
+ m_data.erase( Begin() + indexToRemove );
+ m_lookupData.erase(sequenceName);
}
/*! \fn void SamSequenceDictionary::Remove(const std::vector<SamSequence>& sequences)
\return a modifiable reference to the SamSequence associated with the name
*/
SamSequence& SamSequenceDictionary::operator[](const std::string& sequenceName) {
- if ( !Contains(sequenceName) )
- m_data[sequenceName] = SamSequence(sequenceName, 0);
- return m_data[sequenceName];
+
+ if ( !Contains(sequenceName) ) {
+ SamSequence seq(sequenceName, 0);
+ m_data.push_back(seq);
+ m_lookupData[sequenceName] = m_data.size() - 1;
+ }
+
+ const size_t index = m_lookupData[sequenceName];
+ return m_data.at(index);
}