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 {
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;
00109 ListIterator list_iter;
00110 };
00111
00112 }
00113
00114 #include "ElementConList.cpp"
00115
00116 #endif