From ea3945a9bd8f9830f70b1efa133f9df13b19362f Mon Sep 17 00:00:00 2001 From: mickeyl Date: Tue, 16 Nov 2004 19:14:18 +0000 Subject: libopie1 goes into unsupported --- (limited to 'noncore/unsupported/libopie/pim/orecordlist.h') diff --git a/noncore/unsupported/libopie/pim/orecordlist.h b/noncore/unsupported/libopie/pim/orecordlist.h new file mode 100644 index 0000000..5211f57 --- a/dev/null +++ b/noncore/unsupported/libopie/pim/orecordlist.h @@ -0,0 +1,306 @@ + +#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 -- cgit v0.9.0.2