Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/dataStructures/basic/SetPair.cpp
Go to the documentation of this file.
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
 All Classes Files Functions Variables Typedefs Friends