#ifndef OPIE_RECORD_LIST_H #define OPIE_RECORD_LIST_H #include #include "otemplatebase.h" #include "opimrecord.h" /** * Our List Iterator * it behaves like STL or Qt * * for(it = list.begin(); it != list.end(); ++it ) * doSomeCoolStuff( (*it) ); */ template class ORecordListIterator { 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 ); private: QArray m_uids; int m_current; const Base* m_temp; bool m_end : 1; T m_record; /* d pointer for future versions */ class IteratorPrivate; IteratorPrivate *d; }; /** * The recordlist used as a return type * from OPimAccessTemplate */ template class ORecordList { public: typedef OTemplateBase Base; typedef ORecordListIterator Iterator; /** * c'tor */ ORecordList( const QArray& ids, const Base* ); ~ORecordList(); /** * the first iterator */ Iterator begin(); /** * the end */ Iterator end(); /* ConstIterator begin()const; ConstIterator end()const; */ private: QArray m_ids; const Base* m_acc; }; /* ok now implement it */ template ORecordListIterator::ORecordListIterator() { m_current = 0; m_temp = 0l; m_end = true; } template ORecordListIterator::~ORecordListIterator() { /* nothing to delete */ } template ORecordListIterator::ORecordListIterator( 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; } 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*() { if (!m_end ) m_record = m_temp->find( m_uids[m_current] ); else m_record = T(); return m_record; } template ORecordListIterator &ORecordListIterator::operator++() { if (m_current < m_uids.count() ) { m_end = false; ++m_current; }else m_end = true; return *this; } template ORecordListIterator &ORecordListIterator::operator--() { 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 ) { } template ORecordList::ORecordList( const QArray& ids, const Base* acc ) : m_ids( ids ), m_acc( acc ) { } template ORecordList::~ORecordList() { /* nothing to do here */ } template ORecordList::Iterator ORecordList::begin() { Iterator it( m_ids, m_acc ); return it; } template ORecordList::Iterator ORecordList::end() { Iterator it( m_ids, m_acc ); it.m_end = true; it.m_current = m_ids.count(); } #endif