#ifndef OPIE_RECORD_LIST_H #define OPIE_RECORD_LIST_H #include #include "otemplatebase.h" #include "opimrecord.h" class ORecordListIteratorPrivate; /** * Our List Iterator * it behaves like STL or Qt * * for(it = list.begin(); it != list.end(); ++it ) * doSomeCoolStuff( (*it) ); */ template class ORecordList; template class ORecordListIterator { friend class ORecordList; public: typedef OTemplateBase Base; /** * The c'tor used internally from * ORecordList */ ORecordListIterator( const QArray, const Base* ); /** * The standard c'tor */ ORecordListIterator(); ~ORecordListIterator(); ORecordListIterator( const ORecordListIterator& ); ORecordListIterator &operator=(const ORecordListIterator& ); /** * a * operator ;) * use it like this T = (*it); */ T operator*(); ORecordListIterator &operator++(); ORecordListIterator &operator--(); bool operator==( const ORecordListIterator& it ); bool operator!=( const ORecordListIterator& it ); /** * the current item */ uint current()const; /** * the number of items */ uint count()const; /** * sets the current item */ void setCurrent( uint cur ); private: QArray m_uids; uint m_current; const Base* m_temp; bool m_end : 1; T m_record; bool m_direction :1; /* d pointer for future versions */ ORecordListIteratorPrivate *d; }; class ORecordListPrivate; /** * The recordlist used as a return type * from OPimAccessTemplate */ template class ORecordList { public: typedef OTemplateBase Base; typedef ORecordListIterator Iterator; /** * c'tor */ ORecordList () { } ORecordList( const QArray& ids, const Base* ); ~ORecordList(); /** * the first iterator */ Iterator begin(); /** * the end */ Iterator end(); /** * the number of items in the list */ uint count()const; T operator[]( uint i ); int uidAt(uint i ); /** * Remove the contact with given uid */ bool remove( int uid ); /* ConstIterator begin()const; ConstIterator end()const; */ private: QArray m_ids; const Base* m_acc; ORecordListPrivate *d; }; /* ok now implement it */ template ORecordListIterator::ORecordListIterator() { m_current = 0; m_temp = 0l; m_end = true; m_record = T(); /* forward */ m_direction = TRUE; } template ORecordListIterator::~ORecordListIterator() { /* nothing to delete */ } template ORecordListIterator::ORecordListIterator( const ORecordListIterator& it) { // qWarning("ORecordListIterator copy c'tor"); m_uids = it.m_uids; m_current = it.m_current; m_temp = it.m_temp; m_end = it.m_end; m_record = it.m_record; m_direction = it.m_direction; } template ORecordListIterator &ORecordListIterator::operator=( const ORecordListIterator& it) { m_uids = it.m_uids; m_current = it.m_current; m_temp = it.m_temp; m_end = it.m_end; m_record = it.m_record; return *this; } template T ORecordListIterator::operator*() { //qWarning("operator* %d %d", m_current, m_uids[m_current] ); if (!m_end ) m_record = m_temp->find( m_uids[m_current], m_uids, m_current, m_direction ? Base::Forward : Base::Reverse ); else m_record = T(); return m_record; } template ORecordListIterator &ORecordListIterator::operator++() { m_direction = true; if (m_current < m_uids.count() ) { m_end = false; ++m_current; }else m_end = true; return *this; } template ORecordListIterator &ORecordListIterator::operator--() { m_direction = false; if ( m_current > 0 ) { --m_current; m_end = false; } else m_end = true; return *this; } template bool ORecordListIterator::operator==( const ORecordListIterator& it ) { /* if both are at we're the same.... */ if ( m_end == it.m_end ) return true; if ( m_uids != it.m_uids ) return false; if ( m_current != it.m_current ) return false; if ( m_temp != it.m_temp ) return false; return true; } template bool ORecordListIterator::operator!=( const ORecordListIterator& it ) { return !(*this == it ); } template ORecordListIterator::ORecordListIterator( const QArray uids, const Base* t ) : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ), m_direction( false ) { /* if the list is empty we're already at the end of the list */ if (uids.count() == 0 ) m_end = true; } template uint ORecordListIterator::current()const { return m_current; } template void ORecordListIterator::setCurrent( uint cur ) { if( cur < m_uids.count() ) { m_end = false; m_current= cur; } } template uint ORecordListIterator::count()const { return m_uids.count(); } template ORecordList::ORecordList( const QArray& ids, const Base* acc ) : m_ids( ids ), m_acc( acc ) { } template ORecordList::~ORecordList() { /* nothing to do here */ } template typename ORecordList::Iterator ORecordList::begin() { Iterator it( m_ids, m_acc ); return it; } template typename ORecordList::Iterator ORecordList::end() { Iterator it( m_ids, m_acc ); it.m_end = true; it.m_current = m_ids.count(); return it; } template uint ORecordList::count()const { return m_ids.count(); } template T ORecordList::operator[]( uint i ) { if ( i >= m_ids.count() ) return T(); /* forward */ return m_acc->find( m_ids[i], m_ids, i ); } template int ORecordList::uidAt( uint i ) { return m_ids[i]; } template bool ORecordList::remove( int uid ) { QArray copy( m_ids.count() ); int counter = 0; bool ret_val = false; for (uint i = 0; i < m_ids.count(); i++){ if ( m_ids[i] != uid ){ copy[counter++] = m_ids[i]; }else ret_val = true; } copy.resize( counter ); m_ids = copy; return ret_val; } #endif