Esempio n. 1
0
// Adds a predicate to our list of predicates, deep copying newPredicate into a freshly allocated Predicate object.
void TimeStepInfo::addPredicate(Predicate& newPredicate)
{
	if(predicates == NULL)
	{
		allocatePredicates();
	}
	std::string tempStrName = "";
	// Create a new predicate and copy the information.
	Predicate *newPred = new Predicate();
	tempStrName = newPredicate.getName();
	newPred->setName(tempStrName);
	newPred->setTimeStamp(newPredicate.getMainTimeStamp(), newPredicate.getSubTimeStamp());
	newPred->setBlnIsHPredicate(newPredicate.getBlnIsHPredicate());
	newPred->setBlnIsNegated(newPredicate.getBlnIsNegated());
	newPred->setConstType(newPredicate.getConstType());
	// Insert the new predicate in the appropriate place.
	if(predicates->empty())
	{	// If we don't have predicates yet, make this the first.
		predicates->push_back(newPred);
	}
	else
	{	// If we already have predicates, find this new one's proper place and stick it there.
		std::list<Predicate*>::iterator lIter = predicates->begin();
		int compareResult = 0;
		while(lIter != predicates->end())
		{
			tempStrName = (*lIter)->toPredicateString(false, false);
			compareResult = tempStrName.compare(newPredicate.getName());
			if(compareResult < 0 || compareResult == 0)
			{
				// If the current element comes before the newcomer (or is the same as the newcomer), move on.
				++lIter;
			}
			else
			{
				// The current element should go after the newcomer, break and insert here.
				break;
			}
		}
		predicates->insert(lIter, newPred);
	}
}