Grafalgo
Library of useful data structures and algorithms
|
00001 00009 #include "SetPair.h" 00010 00011 namespace grafalgo { 00012 00017 SetPair::SetPair(int n1) : Adt(n1) { makeSpace(n()); } 00018 00020 SetPair::~SetPair() { freeSpace(); } 00021 00025 void SetPair::makeSpace(int size) { 00026 try { 00027 nxt = new index[size+1]; prv = new index[n()+1]; 00028 } catch (std::bad_alloc e) { 00029 stringstream ss; 00030 ss << "SetPair::makeSpace: insufficient space for " 00031 << size << "index values"; 00032 string s = ss.str(); 00033 throw OutOfSpaceException(s); 00034 } 00035 00036 nn = size; 00037 inHead = inTail = 0; 00038 for (index i = 1; i < size; i++) { 00039 nxt[i] = -(i+1); prv[i+1] = -i; 00040 } 00041 nxt[n()] = prv[1] = 0; 00042 outHead = 1; outTail = n(); 00043 numIn = 0; numOut = n(); 00044 00045 nxt[0] = prv[0] = 0; 00046 } 00047 00049 void SetPair::freeSpace() { delete [] nxt; } 00050 00055 void SetPair::resize(int size) { 00056 freeSpace(); 00057 try { makeSpace(size); } catch(OutOfSpaceException e) { 00058 string s; s = "SetPair::resize:" + e.toString(s); 00059 throw OutOfSpaceException(s); 00060 } 00061 } 00062 00067 void SetPair::expand(int size) { 00068 if (size <= n()) return; 00069 SetPair old(this->n()); old.copyFrom(*this); 00070 resize(size); this->copyFrom(old); 00071 } 00072 00074 void SetPair::copyFrom(const SetPair& source) { 00075 if (&source == this) return; 00076 if (source.n() > n()) resize(source.n()); 00077 else clear(); 00078 for (index x = source.firstIn(); x != 0; x = source.nextIn(x)) 00079 swap(x); 00080 } 00081 00083 void SetPair::clear() { while (firstIn() != 0) swap(firstIn()); } 00084 00089 void SetPair::swap(index i) { 00090 if (i < 1 || i > n()) return; 00091 if (isIn(i)) { 00092 if (nxt[i] == 0) inTail = prv[i]; 00093 else prv[nxt[i]] = prv[i]; 00094 00095 if (prv[i] == 0) inHead = nxt[i]; 00096 else nxt[prv[i]] = nxt[i]; 00097 00098 nxt[i] = 0; 00099 if (outTail == 0) { 00100 outHead = i; prv[i] = 0; 00101 } else { 00102 nxt[outTail] = -i; prv[i] = -outTail; 00103 } 00104 outTail = i; 00105 numIn--; numOut++; 00106 } else { 00107 if (nxt[i] == 0) outTail = -prv[i]; 00108 else prv[-nxt[i]] = prv[i]; 00109 00110 if (prv[i] == 0) outHead = -nxt[i]; 00111 else nxt[-prv[i]] = nxt[i]; 00112 00113 nxt[i] = 0; 00114 if (inTail == 0) { 00115 inHead = i; prv[i] = 0; 00116 } else { 00117 nxt[inTail] = i; prv[i] = inTail; 00118 } 00119 inTail = i; 00120 numIn++; numOut--; 00121 } 00122 } 00123 00128 string& SetPair::toString(string& s) const { 00129 s = "{"; 00130 for (index i = firstIn(); i != 0; i = nextIn(i)) { 00131 string s1; s += Adt::item2string(i,s1); 00132 if (i != lastIn()) s += " "; 00133 } 00134 s += "} {"; 00135 for (index i = firstOut(); i != 0; i = nextOut(i)) { 00136 string s1; s += Adt::item2string(i,s1); 00137 if (i != lastOut()) s += " "; 00138 } 00139 s += "}"; 00140 return s; 00141 } 00142 00143 } // ends namespace