00001 #include "DAPTA.hpp"
00002
00003 namespace DAPTA {
00004
00005
00006
00007
00008
00009 ElementConList::iterator ElementConList::begin() {
00010 return iterator(this, elements.begin());
00011 }
00012
00013
00014
00015
00016 ElementConList::iterator ElementConList::end() {
00017 return iterator(this, elements.end());
00018 }
00019
00020
00021
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
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 }
00085
00086
00087
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
00095
00096 void ElementConList::erase(iterator start, iterator end) {
00097 elements.erase(start.list_iter, end.list_iter);
00098 }
00099
00100
00101
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
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
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
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
00152
00153
00154
00155
00156
00157
00158
00159
00160
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
00173
00174
00175
00176 void ElementConListIterator::increment() {
00177 list_iter++;
00178 if(circ_list->isClosed()) {
00179 if(list_iter == circ_list->elements.end()) {
00180
00181 }
00182 }
00183 }
00184
00185
00186
00187
00188 void ElementConListIterator::decrement() {
00189 list_iter--;
00190 if(circ_list->isClosed()) {
00191 if(list_iter == circ_list->elements.begin()) {
00192
00193
00194 }
00195 }
00196 }
00197
00198 }