/**
	 * Returns set fully checked against dependency (deep, recursive)
	 */
	DependencyIdSet DependencySolver::extractDeepDependencyUnits( const dependency::DependencyIdSet& entrySet, const dependency::DependencyIdMap& ancestorsDependencyMap) {
		dependency::DependencyIdSet retSet;			//copy

		dependency::DependencyIdSet firstStep = extractDependencyUnits(entrySet, ancestorsDependencyMap);

		//contains element that are not in retSet (new one)
		dependency::DependencyIdVector newElems(firstStep.begin(), firstStep.end());	//copy

		while(newElems.size()>0) {
			dependency::DependencyId unit = newElems.back();
			newElems.pop_back();
			retSet.insert(unit);
			//check if unit have dependencies
			if (ancestorsDependencyMap.count(unit) > 0) {
				const dependency::DependencyIdSet& depSet = ancestorsDependencyMap.at(unit);
				dependency::DependencyIdSet::const_iterator diter = depSet.begin();
				dependency::DependencyIdSet::const_iterator deiter = depSet.end();
				for(; diter!=deiter; diter++) {
					DependencyId dId = *diter;
					if(retSet.count(dId)<=0) {
						//new element
						newElems.push_back(dId);
					}
				}
			}
		}

		return retSet;
	}
// Add a T entry
template<class T> void Foam::meshRefinement::updateList
(
    const labelList& newToOld,
    const T& nullValue,
    List<T>& elems
)
{
    List<T> newElems(newToOld.size(), nullValue);

    forAll(newElems, i)
    {
        label oldI = newToOld[i];

        if (oldI >= 0)
        {
            newElems[i] = elems[oldI];
        }
    }