// SamReadGroupDictionary.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 SamReadGroup entries.
// ***************************************************************************
Provides methods for operating on a collection of SamReadGroup entries.
*/
-/*! \typedef BamTools::SamReadGroupIterator
- \brief mutable iterator for SamReadGroupDictionary data
-
- \note This iterator, dereferenced, actually points to a
- std::pair<std::string, SamReadGroup>, NOT a "plain old" SamReadGroup.
- To retrieve the read group object:
-
- \code
- SamReadGroupIterator iter;
- SamReadGroup& rg = (*iter).second // OR iter->second;
- \endcode
-*/
-
-/*! \typedef BamTools::SamReadGroupConstIterator
- \brief const iterator for SamReadGroupDictionary data
-
- \note This iterator, dereferenced, actually points to a
- std::pair<std::string, SamReadGroup>, NOT a "plain old" SamReadGroup.
- To retrieve the read group object:
-
- \code
- SamReadGroupConstIterator iter;
- const SamReadGroup& sq = (*iter).second // OR iter->second;
- \endcode
-*/
-
/*! \fn SamReadGroupDictionary::SamReadGroupDictionary(void)
\brief constructor
*/
*/
SamReadGroupDictionary::SamReadGroupDictionary(const SamReadGroupDictionary& other)
: m_data(other.m_data)
+ , m_lookupData(other.m_lookupData)
{ }
/*! \fn SamReadGroupDictionary::~SamReadGroupDictionary(void)
\param[in] readGroup entry to be added
*/
void SamReadGroupDictionary::Add(const SamReadGroup& readGroup) {
- if ( IsEmpty() || !Contains(readGroup) )
- m_data[readGroup.ID] = readGroup;
+ if ( IsEmpty() || !Contains(readGroup) ) {
+ m_data.push_back(readGroup);
+ m_lookupData[readGroup.ID] = m_data.size() - 1;
+ }
}
/*! \fn void SamReadGroupDictionary::Add(const std::string& readGroupId)
SamReadGroupConstIterator rgIter = readGroups.ConstBegin();
SamReadGroupConstIterator rgEnd = readGroups.ConstEnd();
for ( ; rgIter != rgEnd; ++rgIter )
- Add(rgIter->second);
+ Add(*rgIter);
}
/*! \fn void SamReadGroupDictionary::Add(const std::vector<SamReadGroup>& readGroups)
*/
void SamReadGroupDictionary::Clear(void) {
m_data.clear();
+ m_lookupData.clear();
}
/*! \fn SamReadGroupConstIterator SamReadGroupDictionary::ConstBegin(void) const
\return \c true if dictionary contains a read group with this ID
*/
bool SamReadGroupDictionary::Contains(const std::string& readGroupId) const {
- return ( m_data.find(readGroupId) != m_data.end() );
+ return ( m_lookupData.find(readGroupId) != m_lookupData.end() );
}
/*! \fn bool SamReadGroupDictionary::Contains(const SamReadGroup& readGroup) const
\sa Remove()
*/
void SamReadGroupDictionary::Remove(const std::string& readGroupId) {
- m_data.erase(readGroupId);
+
+ // skip if empty dictionary or if ID unknown
+ if ( IsEmpty() || !Contains(readGroupId) )
+ return;
+
+ // update 'lookup index' for every entry after @readGroupId
+ const size_t indexToRemove = m_lookupData[readGroupId];
+ const size_t numEntries = m_data.size();
+ for ( size_t i = indexToRemove+1; i < numEntries; ++i ) {
+ const SamReadGroup& rg = m_data.at(i);
+ --m_lookupData[rg.ID];
+ }
+
+ // erase entry from containers
+ m_data.erase( Begin() + indexToRemove );
+ m_lookupData.erase(readGroupId);
}
/*! \fn void SamReadGroupDictionary::Remove(const std::vector<SamReadGroup>& readGroups)
\return a modifiable reference to the SamReadGroup associated with the ID
*/
SamReadGroup& SamReadGroupDictionary::operator[](const std::string& readGroupId) {
- if ( !Contains(readGroupId) )
- m_data[readGroupId] = SamReadGroup(readGroupId);
- return m_data[readGroupId];
+
+ if ( !Contains(readGroupId) ) {
+ SamReadGroup rg(readGroupId);
+ m_data.push_back(rg);
+ m_lookupData[readGroupId] = m_data.size() - 1;
+ }
+
+ const size_t index = m_lookupData[readGroupId];
+ return m_data.at(index);
}