#ifndef OPIE_RECORD_LIST_H #define OPIE_RECORD_LIST_H #include #include template class ORecordList { public: class Iterator { friend class ORecordList; public: Iterator(); ~Iterator(); Iterator(const Iterator& ); Iterator &operator=(const Iterator& ); T &operator*(); Iterator &operator++(); Iterator &operator--(); bool operator==( const Iterator& it ); bool operator!=( const Iterator& it ); private: Iterator( const QArray, OPimAccessTemplate* ); QArray m_uids; int m_current; OPimAccessTemplate* m_temp; bool m_end : 1; T m_record; /* d pointer for future versions */ class IteratorPrivate; IteratorPrivate *d; }; ORecordList( const QArray& ids, OPimAccessTemplate* acc ); ~ORecordList(); Iterator begin(); Iterator end(); /* ConstIterator begin()const; ConstIterator end()const; */ private: QArray m_ids; OPimAccessTemplate* m_acc; }; /* ok now implement it */ template ORecordList::Iterator::Iterator() { m_current = 0; m_temp = 0l; m_end = true; } template ORecordList::Iterator::~Iterator() { /* nothing to delete */ } template ORecordList::Iterator::Iterator( const ORecordList::Iterator& 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 ORecordList::Iterator &ORecordList::Iterator::operator=( const ORecordList::Iterator& 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 &ORecordList::Iterator::operator*() { if (!m_end ) m_record = m_temp->find( m_uids[m_current] ); else m_record = T; return m_record; } template ORecordList::Iterator &ORecordList::Iterator::operator++() { if (m_current < m_uids.count() ) { m_end = false; ++m_current; }else m_end = true; return *this; } template ORecordList::Iterator &ORecordList::Iterator::operator--() { if ( m_current > 0 ) { --m_current; m_end = false; } else m_end = true; return *this; } template bool ORecordList::Iterator::operator==( const ORecordList::Iterator& 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 ORecordList::Iterator::operator!=( const ORecordList::Iterator it ) { return !(*this == it ); } template ORecordList::Iterator::Iterator( const QArray uids, OPimAccessTemplate* t ) : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ) { } template ORecordList::ORecordList( const QArray& ids, OPimAccessTemplate* 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