File indexing completed on 2024-12-08 11:06:52

0001 //
0002 // C++ Interface: flowconnectorlist
0003 //
0004 // Description:
0005 //
0006 //
0007 // Author: David Saxton, Alan Grimes, Zoltan Padrah <zoltan.padrah@gmail.com>, (C) 2009
0008 //
0009 // Copyright: See COPYING file that comes with this distribution
0010 //
0011 //
0012 #ifndef FLOWCONNECTORLIST_H
0013 #define FLOWCONNECTORLIST_H
0014 
0015 #include "flowconnector.h"
0016 
0017 #include <QList>
0018 
0019 class Connector;
0020 class FlowConnector;
0021 
0022 // these typedef's shoud go in a separate header one day
0023 typedef QList<QPointer<Connector>> ConnectorList;
0024 
0025 /**
0026  * @short a list of connector between FlowNodes
0027  * @author David Saxton, Alan Grimes, Zoltan Padrah <zoltan.padrah@gmail.com>
0028  *
0029  * This class implements a list of FlowConnector objects; this class fulfills two
0030  * requirements:
0031  * 1. it provides type safety for classes related to flowparts
0032  * 2. can be cast to a generic ConnectorList, to be used in other contexts
0033  *
0034  * For QList interface see http://doc.trolltech.com/3.3/qlist.html
0035  */
0036 
0037 /*
0038     Notations used in the source code:
0039      O(n) : the method has this complexitiy
0040      assert ? : in that method some assertions could be made, considering
0041             that the two list should have the same contents
0042  */
0043 
0044 class FlowConnectorList
0045 {
0046 public:
0047     // cast operator, for casting it to ConnectorList
0048     operator ConnectorList()
0049     {
0050         return list;
0051     }
0052 
0053     // QList's interface
0054     typedef QPointer<FlowConnector> T;
0055 
0056 #define CAST_POINTER_CONN(p) (static_cast<QPointer<Connector> >(static_cast<Connector*>(static_cast<FlowConnector*>(p))))
0057 
0058     typedef QList<T>::iterator iterator;
0059     typedef QList<T>::const_iterator const_iterator;
0060     typedef T value_type;
0061     typedef value_type *pointer;
0062     typedef const value_type *const_pointer;
0063     typedef value_type &reference;
0064     typedef const value_type &const_reference;
0065     typedef size_t size_type;
0066 
0067     FlowConnectorList()
0068         : list()
0069         , flowList()
0070     {
0071     }
0072 
0073     FlowConnectorList(const QList<T> &l); /* : flowList(l) { // O(n)
0074    FlowConnectorList::iterator it, end = flowList.end();
0075    for( it = flowList.begin(); it != end; it++)
0076        list.append( CAST_POINTER *it);
0077 } */
0078 
0079     /* FlowConnectorList ( const std::list<T> & l ) ; */ /* : flowList(l) {
0080         FlowConnectorList::iterator it, end = flowList.end();
0081         for( it = flowList.begin(); it != end; it++)
0082             list.append( CAST_POINTER *it);
0083     } */
0084 
0085     ~FlowConnectorList()
0086     {
0087     } // leak check ?
0088 
0089     QList<T> &operator=(const QList<T> &l); /* { // -> O(n)
0090   flowList = l;
0091   list.clear();
0092   FlowConnectorList::iterator it, end = flowList.end();
0093   for( it = flowList.begin(); it != end; it++)
0094       list.append( CAST_POINTER  *it);
0095   return flowList;
0096 } */
0097 
0098     /* QList<T> & operator= ( const std::list<T> & l ) ; */ /* {    // O(n)
0099         flowList = l;
0100         list.clear();
0101         FlowConnectorList::iterator it, end = flowList.end();
0102         for( it = flowList.begin(); it != end; it++)
0103             list.append( CAST_POINTER *it);
0104 
0105         return flowList;
0106     } */
0107 
0108     /* bool operator== ( const std::list<T> & l ) const ; */ /* {
0109        return flowList == l;
0110    } */
0111 
0112     bool operator==(const QList<T> &l) const
0113     {
0114         return flowList == l;
0115     }
0116 
0117     bool operator!=(const QList<T> &l) const
0118     {
0119         return flowList != l;
0120     }
0121 
0122     iterator begin()
0123     {
0124         return flowList.begin();
0125     }
0126 
0127     const_iterator begin() const
0128     {
0129         return flowList.begin(); // ?
0130     }
0131 
0132     const_iterator constBegin() const
0133     {
0134         return flowList.constBegin();
0135     }
0136 
0137     iterator end()
0138     {
0139         return flowList.end();
0140     }
0141 
0142     const_iterator end() const
0143     {
0144         return flowList.end(); // ?
0145     }
0146 
0147     const_iterator constEnd() const
0148     {
0149         return flowList.constEnd();
0150     }
0151 
0152     iterator insert(iterator it, const T &x); /* {  // O(n)
0153    list.insert(  convertIterator( it ), CAST_POINTER x);
0154    return flowList.insert(it,x);
0155 } */
0156 
0157     uint remove(const T &x); /* {
0158    list.remove( CAST_POINTER  x);
0159    return flowList.remove(x);
0160 } */
0161 
0162     void clear()
0163     {
0164         flowList.clear();
0165         list.clear();
0166     }
0167 
0168     QList<T> &operator<<(const T &x); /* {
0169   list << CAST_POINTER  x;
0170   return flowList << x;
0171 } */
0172 
0173     size_type size() const
0174     { // assert ?
0175         return flowList.size();
0176     }
0177 
0178     bool empty() const
0179     { // assert ?
0180         return flowList.empty();
0181     }
0182 
0183     void push_front(const T &x); /* {
0184    list.push_front(CAST_POINTER x);
0185    flowList.push_front(x);
0186 } */
0187 
0188     void push_back(const T &x); /* {
0189    list.push_back(CAST_POINTER x);
0190    flowList.push_back(x);
0191 } */
0192 
0193     iterator erase(iterator it)
0194     { // O(n)
0195         list.erase(convertIterator(it));
0196         return flowList.erase(it);
0197     }
0198 
0199     iterator erase(iterator first, iterator last)
0200     { // O(n)
0201         list.erase(convertIterator(first), convertIterator(last));
0202         return flowList.erase(first, last);
0203     }
0204 
0205     reference front()
0206     {
0207         return flowList.front();
0208     }
0209 
0210     const_reference front() const
0211     {
0212         return flowList.front();
0213     }
0214 
0215     reference back()
0216     {
0217         return flowList.back();
0218     }
0219 
0220     const_reference back() const
0221     {
0222         return flowList.back();
0223     }
0224 
0225     void pop_front()
0226     {
0227         flowList.pop_front();
0228         list.pop_front();
0229     }
0230 
0231     void pop_back()
0232     {
0233         flowList.pop_back();
0234         list.pop_back();
0235     }
0236 
0237     /* void insert ( iterator pos, size_type n, const T & x ) ; */ /* {     // O(n)
0238         list.insert( convertIterator(pos) ,n, CAST_POINTER x);
0239         flowList.insert(pos,n,x);
0240     } */
0241 
0242     QList<T> operator+(const QList<T> &l) const
0243     {
0244         return flowList + l;
0245     }
0246 
0247     QList<T> &operator+=(const QList<T> &l); /* {   // O(n)
0248   const_iterator end = l.end();
0249   for(const_iterator it = l.begin(); it != end; it++)
0250       list.append( CAST_POINTER  *it );
0251   return flowList += l;
0252 } */
0253 
0254     /* iterator fromLast () ; */ /* {
0255         return flowList.fromLast();
0256     } */
0257 
0258     /* const_iterator fromLast () const ; */ /* {
0259         return flowList.fromLast();
0260     } */
0261 
0262     bool isEmpty() const
0263     {
0264         return flowList.isEmpty();
0265     }
0266 
0267     iterator append(const T &x); /* {
0268    list.append(CAST_POINTER x);
0269    // return flowList.append(x);
0270    flowList.append(x);
0271    iterator ret = flowList.end();
0272    --ret;
0273    return ret;
0274 } */
0275 
0276     iterator prepend(const T &x); /* {
0277    list.prepend(CAST_POINTER x);
0278    //return flowList.prepend(x);
0279    flowList.prepend(x);
0280    return flowList.begin();
0281 } */
0282 
0283     iterator remove(iterator it)
0284     {
0285         // -> O(n)
0286         list.erase(convertIterator(it));
0287         return flowList.erase(it);
0288     }
0289 
0290     T &first()
0291     { // assert ?
0292         return flowList.first();
0293     }
0294 
0295     const T &first() const
0296     { // assert ?
0297         return flowList.first();
0298     }
0299 
0300     T &last()
0301     { // assert ?
0302         return flowList.last();
0303     }
0304 
0305     const T &last() const
0306     { // assert ?
0307         return flowList.last();
0308     }
0309 
0310     T &operator[](size_type i)
0311     { // assert ?
0312         return flowList[i];
0313     }
0314 
0315     const T &operator[](size_type i) const
0316     { // assert ?
0317         return flowList[i];
0318     }
0319 
0320     iterator at(size_type i)
0321     { // assert ?
0322         // return flowList.at(i);
0323         iterator ret = flowList.begin();
0324         ret += i;
0325         return ret;
0326     }
0327 
0328     const_iterator at(size_type i) const
0329     { // assert ?
0330         // return flowList.at(i);
0331         const_iterator ret = flowList.constBegin();
0332         ret += i;
0333         return ret;
0334     }
0335 
0336     iterator find(const T &x)
0337     { // assert ?
0338         int i = flowList.indexOf(x);
0339         return (i == -1 ? flowList.end() : (flowList.begin() + i));
0340         // return flowList.find(x); // 2018.11.30
0341     }
0342 
0343     const_iterator find(const T &x) const
0344     { // assert ?
0345         int i = flowList.indexOf(x);
0346         return (i == -1 ? flowList.end() : (flowList.begin() + i));
0347         // return flowList.find(x); // 2018.11.30
0348     }
0349 
0350     iterator find(iterator it, const T &x)
0351     { // assert ?
0352         // return flowList.find(it, x); // 2018.11.30
0353         int i = flowList.indexOf(x, it - flowList.begin());
0354         return i == -1 ? flowList.end() : flowList.begin() + i;
0355     }
0356 
0357     const_iterator find(const_iterator it, const T &x) const
0358     { // assert ?
0359         // return flowList.find(it, x); // 2018.11.30
0360         int i = flowList.indexOf(x, it - flowList.begin());
0361         return i == -1 ? flowList.end() : flowList.begin() + i;
0362     }
0363 
0364     int indexOf(const T &x) const
0365     { // assert ?
0366         return flowList.indexOf(x);
0367     }
0368 
0369     size_type contains(const T &x) const
0370     {
0371         // return flowList.contains(x);
0372         return flowList.count(x);
0373     }
0374 
0375     size_type count() const
0376     { // assert ?
0377         return flowList.count();
0378     }
0379 
0380     QList<T> &operator+=(const T &x); /* {
0381   list += CAST_POINTER x;
0382   return flowList += x;
0383 } */
0384 
0385 private:
0386     ConnectorList list;
0387     QList<T> flowList;
0388 
0389     /**
0390      *    Converts an iterator from FlowConnector list to Connector list. Complexity: O(n) !
0391      * @param orig original iterator from FlowConnector list
0392      * @return iterator converted to Connector list
0393      */
0394     ConnectorList::iterator convertIterator(QList<T>::iterator orig)
0395     {
0396         ConnectorList::iterator it2 = list.begin();
0397         for (QList<T>::iterator it = flowList.begin(); it != orig; it++)
0398             it2++;
0399         return it2;
0400     }
0401 };
0402 
0403 #endif