void SearchSpaceTimerEvaluatorImpl<T>::releaseResultIter(IteratorPtr<LookupResult<T> >& pFindResultIter) {
	while(pFindResultIter != NullPtr && !pFindResultIter->isDone()) {
		T element = pFindResultIter->getObj().m_resultElement;
		pFindResultIter->next();
		_destroy(element);
	}
	_destroy(pFindResultIter);
	pFindResultIter = NullPtr;
}
IteratorPtr<T> ComposerBasedElementApproximator<T>::getExtractedElementIterator(IteratorPtr<LookupResult<T> > pLookupResultIter,
		combination_counter_t* pCombinationCounter) {
	std::vector<T> elements;
	int count = 0;
	while(!pLookupResultIter->isDone() && (m_buildingBlocksBucketMaxSize == 0 || ++count <= m_buildingBlocksBucketMaxSize)) {
		elements.push_back(pLookupResultIter->getObj().m_resultElement);
		pLookupResultIter->next();
	}

	//Side-effect: Count maximum possible number of combinations
	std::cout << "Size of subset: " << elements.size() << "\n";
	if(pCombinationCounter != NULL) {
		*pCombinationCounter *= elements.size();
	}

	return IteratorPtr<T>(new VectorBasedReadOnlyIteratorImpl<T>(elements));
}
void getSortedResults(IteratorPtr<LookupResult<T> > pFindResultIter,
		DistanceCalculatorPtr<T> pDistanceCaculator,
		T pTarget,
		ElementWithDistances<T>& sortedResults) {

	pFindResultIter->toBegin();

	//Traverse iterator to get element and push to results vector
	while(!pFindResultIter->isDone()) {

#ifdef DENOISING
		if(pFindResultIter->getObj().m_distanceToTarget >= NOISE_THRESOLD) {
			sortedResults.push_back(pFindResultIter->getObj());
		}
#endif

		pFindResultIter->next();
	}

	//Wind-back the iterator for future purpose
	pFindResultIter->toBegin();
}
IteratorPtr<LookupResult<T> > ComposerBasedElementApproximator<T>::getFullResultIterator(IteratorPtr<LookupResult<T> > pResultIter,
		DistanceCalculatorPtr<T> pDistanceCalculator) {

	std::vector<LookupResult<T> > fullResults;

	if(pResultIter != NullPtr) {
		while(!pResultIter->isDone()) {
			LookupResult<T> resultObj = pResultIter->getObj();
			fullResults.push_back(resultObj);
			pResultIter->next();
		}
		pResultIter->toBegin();

		//Filter results before sort
		if(m_pLookupResultFilter != NullPtr) {
			m_pLookupResultFilter->filterLookupResults(fullResults, pDistanceCalculator, false);
		}

		std::sort(fullResults.begin(), fullResults.end(), DistanceComparator<T>());
	}
	return IteratorPtr<LookupResult<T> >(new VectorBasedReadOnlyIteratorImpl<LookupResult<T> >(fullResults));
}