tools/ElementConList.hpp

00001 #ifndef __ELEMENTCONLIST_HPP__
00002 #define __ELEMENTCONLIST_HPP__
00003 
00004 #include <list>
00005 #include <map>
00006 
00007 #include <boost/iterator/iterator_facade.hpp>
00008 
00009 namespace DAPTA { // Define namespace DAPTA
00010 
00012 
00017 class ElementConList {
00018    public:
00019       enum LinkState {
00020          broken = 2,
00021          con    = 0,
00022          discon = 1
00023       }; 
00024       
00025       struct ListData {
00026          ListData(int id, LinkState state, int prev, int next) : elem_globalID(id), link_state(state), prev_elem(prev), next_elem(next) {;}
00027          
00028          bool operator==(ListData const& other) const { return ((elem_globalID == other.elem_globalID) && (link_state == other.link_state)); }
00029          bool operator==(int id) const { return (elem_globalID == id); }
00030          
00031          int       elem_globalID;
00032          LinkState link_state;
00033          
00034          int       prev_elem;
00035          int       next_elem;
00036       }; 
00037       
00038       typedef std::list<ListData>    ListType;
00039       typedef ListType::iterator     ListIterator;
00040       typedef ElementConListIterator iterator;
00041       
00042       ElementConList() {;}
00043       ElementConList(int e) { elements.push_back(ListData(e, discon, 0, 0)); }
00044       ~ElementConList() {;}
00045       
00046       iterator begin();                                        
00047       iterator end();                                          
00048       
00049       void add_elem(int elem, int prev, int next);             
00050       void insert(iterator loc, iterator start, iterator end); 
00051       void erase(iterator start, iterator end);                
00052       int  size() { return elements.size(); }                  
00053       void break_chain(int elem1, int elem2);                  
00054       
00055       bool isClosed();                                         
00056       bool needSplit();                                        
00057       
00058       template <typename OI>
00059       void GetLinkStateArray(OI ins_iter);                     
00060       template <typename II>
00061       void SetLinkStateArray(II ins_iter);                     
00062       
00063       ListData operator[](int ind) {
00064          ListIterator iter=elements.begin();
00065          for(int i=0; (i<ind)&&(iter!=elements.end()); i++)
00066             iter++;
00067          return (*iter);
00068       }
00069       ListData at(int ind) {
00070          ListIterator iter=elements.begin();
00071          for(int i=0; (i<ind)&&(iter!=elements.end()); i++)
00072             iter++;
00073          return (*iter);
00074       }
00075    private:
00076       friend class ElementConListIterator;
00077    
00078       ListType elements;                                       
00079 };
00080 
00082 
00084 class ElementConListIterator 
00085    : public boost::iterator_facade<ElementConListIterator, ElementConList::ListData, boost::forward_traversal_tag> {
00086    public:
00087       typedef ElementConList::ListType     ListType;
00088       typedef ElementConList::ListIterator ListIterator;
00089       typedef ElementConListIterator       iterator;
00090       
00091       ElementConListIterator() : 
00092          circ_list(0), 
00093          list_iter(0) {;}
00094       ElementConListIterator(ElementConList* _list, ListIterator _iter) : 
00095          circ_list(_list), 
00096          list_iter(_iter) {;}
00097       ~ElementConListIterator() {;}
00098    private:
00099       friend class boost::iterator_core_access;
00100       friend class ElementConList;
00101       
00102       void increment();
00103       void decrement();
00104       
00105       bool equal(iterator const& other) const { return this->list_iter == other.list_iter; }
00106       ElementConList::ListData& dereference() const { return (*list_iter); }
00107       
00108       ElementConList* circ_list; //<! Pointer to the list being iterated through
00109       ListIterator    list_iter; //<! Iterator for the data list inside circ_list
00110 };
00111 
00112 } // namespace DAPTA
00113 
00114 #include "ElementConList.cpp"
00115 
00116 #endif

Generated on Tue May 29 17:13:49 2007 for DAPTA by  doxygen 1.5.1