/*
* Project: MoleCuilder
* Description: creates and alters molecular systems
* Copyright (C) 2010-2012 University of Bonn. All rights reserved.
*
*
* This file is part of MoleCuilder.
*
* MoleCuilder is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* MoleCuilder is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MoleCuilder. If not, see .
*/
/*
* KeySet.cpp
*
* Created on: Oct 20, 2011
* Author: heber
*/
#ifdef HAVE_CONFIG_H
#include
#endif
#include "CodePatterns/MemDebug.hpp"
#include
#include "CodePatterns/Log.hpp"
#include "KeySet.hpp"
/** Constructor of class KeySet.
*
* This class contains a set of indices for the atoms contained in a fragment.
*
*/
KeySet::KeySet()
{}
/** Destructor of class KeySet.
*
*/
KeySet::~KeySet()
{}
/** Comparator to allow for placing in a map.
*
* @param a instance to compare to
* @return true - this instance has less items or the first different item itself is less,
* false - else
*/
bool KeySet::operator<(const KeySet &a) const
{
//LOG(0, "my check is used.");
if (size() < a.size()) {
return true;
} else {
if (size() > a.size()) {
return false;
} else {
KeySet::iterator IteratorA = begin();
KeySet::iterator IteratorB = a.begin();
while ((IteratorA != end()) && (IteratorB != a.end())) {
if ((*IteratorA) < (*IteratorB))
return true;
else if ((*IteratorA) > (*IteratorB)) {
return false;
} // else, go on to next index
IteratorA++;
IteratorB++;
} // end of while loop
}// end of check in case of equal sizes
}
return false; // if we reach this point, they are equal
}
/** Scans a single line for number and puts them into \a KeySet.
* \param *buffer buffer to scan
* \return true - at least one valid atom id parsed, false - CurrentSet is empty
*/
bool KeySet::ScanBufferIntoKeySet(char *buffer)
{
std::stringstream line;
int AtomNr;
int status = 0;
line.str(buffer);
while (!line.eof()) {
line >> AtomNr;
if (AtomNr >= 0) {
insert(AtomNr); // insert at end, hence in same order as in file!
status++;
} // else it's "-1" or else and thus must not be added
}
std::stringstream output;
for(KeySet::iterator runner = begin(); runner != end(); runner++)
output << (runner == begin() ? "" : " " ) << (*runner);
LOG(2, "INFO: The scanned KeySet is " << output.str());
return (status != 0);
}