tools/ElementConList.cpp

00001 #include "DAPTA.hpp"
00002 
00003 namespace DAPTA { // Define namespace DAPTA
00004 
00005 /* ELEMENTCONLIST FUNCTIONS */
00006 /*
00007 ElementConList::iterator ElementConList::begin()
00008 */
00009 ElementConList::iterator ElementConList::begin() {
00010    return iterator(this, elements.begin());
00011 }
00012 
00013 /*
00014 ElementConList::iterator ElementConList::end()
00015 */
00016 ElementConList::iterator ElementConList::end() {
00017    return iterator(this, elements.end());
00018 }
00019 
00020 /*
00021 void ElementConList::add_elem(int elem, int prev, int next)
00022 */
00023 void ElementConList::add_elem(int elem, int prev, int next) {
00024    ListIterator iter_prev = std::find(elements.begin(), elements.end(), prev);
00025    ListIterator iter_next = std::find(elements.begin(), elements.end(), next);
00026    
00027    LinkState state;
00028    (next != 0) ? state=con : state=discon;
00029    ListData new_elem(elem, state, prev, next);
00030    
00031    if(iter_prev != elements.end()) {
00032       iter_prev->next_elem = elem;
00033       iter_prev->link_state = con;
00034    }
00035    if(iter_next != elements.end()) {
00036       iter_next->prev_elem = elem;
00037    }
00038    
00039    ListIterator iter_elem;
00040    if(iter_next != elements.end()) {
00041       iter_elem = elements.insert(iter_next, new_elem);
00042    }
00043    else {
00044       iter_elem = elements.insert(elements.end(), new_elem);
00045    }
00046    
00047    ListIterator cur_iter = iter_prev;
00048    ListIterator ins_iter = iter_elem;
00049    while((cur_iter != elements.end()) && (cur_iter != iter_elem)) {
00050       ins_iter = elements.insert(ins_iter, *cur_iter);
00051       elements.erase(cur_iter);
00052       cur_iter = std::find(elements.begin(), elements.end(), ins_iter->prev_elem);
00053    }
00054    
00055 /* ListIterator iter_prev = std::find(elements.begin(), elements.end(), prev);
00056    ListIterator iter_next = std::find(elements.begin(), elements.end(), next);
00057    
00058    LinkState state;
00059    (next != 0) ? state=con : state=discon;
00060    ListData new_elem(elem, state);
00061    
00062    if(iter_prev != elements.end()) iter_prev->link_state = con;
00063    
00064    if(iter_next != elements.end()) {
00065       if(iter_prev == elements.end()) iter_prev = elements.begin();
00066       else iter_prev++;
00067       elements.insert(iter_prev, new_elem);
00068    }
00069    else {
00070       ListIterator iter_new = elements.insert(iter_next, new_elem);
00071       if(iter_prev != elements.end()) {
00072          // Rearrange the list to put all the items at prev and before, actually before the new element
00073          // THIS IS A COMPLETE BODGE! BETTER CODE NEEDED!
00074          // THIS ACTUALLY THEN STILL MESSES UP SOME ELEMENT CONNECTIVITY LISTS!
00075          do {
00076             iter_new = elements.insert(iter_new, *iter_prev);
00077             iter_prev = elements.erase(iter_prev);
00078             if(iter_prev == elements.begin()) iter_prev = elements.end();
00079             iter_prev--;
00080          } while((iter_prev->link_state = con) && (iter_prev != iter_next));
00081       }
00082    }
00083 */
00084 }
00085 
00086 /*
00087 void ElementConList::insert(iterator loc, iterator start, iterator end)
00088 */
00089 void ElementConList::insert(iterator loc, iterator start, iterator end) {
00090    elements.insert(loc.list_iter, start.list_iter, end.list_iter);
00091 }
00092 
00093 /*
00094 void ElementConList::erase(iterator start, iterator end)
00095 */
00096 void ElementConList::erase(iterator start, iterator end) {
00097    elements.erase(start.list_iter, end.list_iter);
00098 }
00099 
00100 /*
00101 void ElementConList::break_chain(int elem1, int elem2)
00102 */
00103 void ElementConList::break_chain(int elem1, int elem2) {
00104    ListIterator iter1 = std::find(elements.begin(), elements.end(), elem1);
00105    ListIterator iter2 = std::find(elements.begin(), elements.end(), elem2);
00106    
00107    ListIterator iter1_plus = iter1; ++iter1_plus;
00108    ListIterator iter2_plus = iter2; ++iter2_plus;
00109    
00110    if((iter1_plus == iter2) || ((iter1_plus == elements.end()) && (iter2 == elements.begin()))) {
00111       iter1->link_state = broken;
00112    }
00113    if((iter2_plus == iter1) || ((iter2_plus == elements.end()) && (iter1 == elements.begin()))) {
00114       iter2->link_state = broken;
00115    }
00116 }
00117 
00118 /*
00119 bool ElementConList::isClosed()
00120 */
00121 bool ElementConList::isClosed() {
00122    for(ListIterator iter=elements.begin(); iter!=elements.end(); ++iter) {
00123       if(iter->link_state != con) return false;
00124    }
00125    return true;
00126 }
00127 
00128 /*
00129 bool ElementConList::needSplit()
00130 */
00131 bool ElementConList::needSplit() {
00132    int count=0;
00133    for(ListIterator iter=elements.begin(); iter!=elements.end(); ++iter) {
00134       if(iter->link_state) count++;
00135    }
00136    if(count > 1) return true;
00137    else return false;
00138 }
00139 
00140 /*
00141 void ElementConList::GetLinkStateArray(OI ins_iter)
00142 */
00143 template <typename OI>
00144 void ElementConList::GetLinkStateArray(OI ins_iter) {
00145    for(ListIterator list_iter=elements.begin(); list_iter!=elements.end(); ++list_iter) {
00146       *ins_iter++ = list_iter->link_state;
00147    }
00148 }
00149 
00150 /*
00151 void ElementConList::SetLinkStateArray(std::vector<int> link_states)
00152 */
00153 /*void ElementConList::SetLinkStateArray(std::vector<int> link_states) {
00154    std::vector<int>::iterator new_iter = link_states.begin();
00155    for(ListIterator list_iter=elements.begin(); list_iter!=elements.end(); ++list_iter) {
00156       list_iter->link_state = (LinkState)*new_iter++;
00157    }
00158 }*/
00159 /*
00160 void ElementConList::SetLinkStateArray(II ins_iter)
00161 */
00162 template <typename II>
00163 void ElementConList::SetLinkStateArray(II ins_iter) {
00164    for(ListIterator list_iter=elements.begin(); list_iter!=elements.end(); ++list_iter) {
00165       list_iter->link_state = (LinkState)*ins_iter++;
00166    }
00167 }
00168 
00169 
00170 
00171 
00172 /* ELEMENTCONLISTITERATOR FUNCTIONS */
00173 /*
00174 void ElementConListIterator::increment()
00175 */
00176 void ElementConListIterator::increment() {
00177    list_iter++;
00178    if(circ_list->isClosed()) {
00179       if(list_iter == circ_list->elements.end()) {
00180          //list_iter = circ_list->elements.begin();
00181       }
00182    }
00183 }
00184 
00185 /*
00186 void ElementConListIterator::decrement()
00187 */
00188 void ElementConListIterator::decrement() {
00189    list_iter--;
00190    if(circ_list->isClosed()) {
00191       if(list_iter == circ_list->elements.begin()) {
00192          //list_iter = circ_list->elements.end();
00193          //list_iter--;
00194       }
00195    }
00196 }
00197 
00198 } // namespace DAPTA

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