--- trunk/OOPSE/libmdtools/Exclude.cpp 2003/03/27 22:16:27 431 +++ trunk/OOPSE/libmdtools/Exclude.cpp 2004/06/01 21:45:22 1217 @@ -1,75 +1,101 @@ #include -#include +#include - #include "Exclude.hpp" -int Exclude::nExcludes; -int* Exclude::exPairs; +Exclude* Exclude::_instance = 0; -Exclude::Exclude( int theIndex ){ - exI = theIndex*2; - exJ = theIndex*2 + 1; +Exclude* Exclude::Instance() { + if (_instance == 0) { + _instance = new Exclude; + } + return _instance; } -void Exclude::createArray( int the_nExcludes ){ - - nExcludes = the_nExcludes; - std::cerr << "nExcludes = " << nExcludes << "\n"; - exPairs = new int[nExcludes*2]; +Exclude::Exclude(){ + exPairs = NULL; + newFortranArrayNeeded = 1; } -void Exclude::destroyArray( void ){ - delete[] exPairs; +Exclude::~Exclude() { + if (exPairs != NULL) { + delete[] exPairs; + } + delete _instance; } + +int* Exclude::getFortranArray(){ + + set >::iterator i; + int j; -void Exclude::setPair( int i, int j ){ - exPairs[exI] = i; - exPairs[exJ] = j; + if (newFortranArrayNeeded != 0) { + delete[] exPairs; + exPairs = new int[2*getSize()]; + j = 0; + for(i = excludeSet.begin(); i != excludeSet.end(); ++i) { + exPairs[j] = (*i).first; + j++; + exPairs[j] = (*i).second; + j++; + } + newFortranArrayNeeded = 0; + } + + return exPairs; } -void Exclude::addExcludePairs(int nAdded, int* AexPairs) { - int nNew = nExcludes + nAdded; + +void Exclude::addPair(int i, int j) { - int* new_exPairs = new int[nNew*2]; - int i, j; + if (!hasPair(i, j)) { + + if (i != j) { + + if (i < j) + excludeSet.insert(make_pair(i, j)); + else + excludeSet.insert(make_pair(j, i)); + } - for (i = 0; i < 2*nExcludes; i++) { - new_exPairs[i] = exPairs[i]; + newFortranArrayNeeded = 1; } - for (i=0; i < 2*nAdded; i++) { - j = i + 2*nExcludes; - new_exPairs[j] = AexPairs[i]; - } +} - delete[] exPairs; - exPairs = new_exPairs; +void Exclude::printMe( void ){ - nExcludes = nNew; -} + set >::iterator i; + int index; + + index = 0; + for(i = excludeSet.begin(); i != excludeSet.end(); ++i) { -void Exclude::deleteExcludePair(int theIndex) { - deleteRange(theIndex, theIndex); + std::cerr << "exclude[" << index << "] i, j: " << (*i).first << " - " << (*i).second << "\n"; + index++; + + } } -void Exclude::deleteRange(int startIndex, int stopIndex) { +int Exclude::hasPair(int i, int j) { - int nNew = nExcludes - (stopIndex - startIndex + 1); - int* new_exPairs = new int[nNew*2]; - int i, j; + set >::iterator position; - for (i=0; i < 2*startIndex; i++) { - new_exPairs[i] = exPairs[i]; - } - for(i=2*(stopIndex+1); i < 2*nExcludes; i++) { - j = i-2*startIndex + 1; - new_exPairs[j] = exPairs[i]; - } + if (i != j) { + if (i < j) + position = excludeSet.find(make_pair(i, j)); + else + position = excludeSet.find(make_pair(j, i)); - delete[] exPairs; - - exPairs = new_exPairs; - nExcludes = nNew; + if (position != excludeSet.end()) + return 1; + else + return 0; + } else + return 0; } + +int Exclude::getSize() { + return excludeSet.size(); +}