void CBaseObject::CollectValidDistStartingObjectsAndSetClearedToRoot(CBaseObject* pcTo, CDistCalculatorParameters* pcParameters) { //It is assumed at this point that all the tos and froms have been updated. //This method will only be called on an object that can find Root. ValidateNotEmbedded(__METHOD__); int i; CArrayTemplateEmbeddedBaseObjectPtr apcFroms; CBaseObject* pcFrom; CBaseObject* pcContainer; if (IsRoot()) { return; } if (!IsDistToRootValid()) { pcParameters->AddTouched(this); SetDistToRoot(CLEARED_DIST_TO_ROOT); SetFlag(OBJECT_FLAGS_CLEARED_DIST_TO_ROOT, TRUE); apcFroms.Init(); GetHeapFroms(&apcFroms); if (apcFroms.NumElements() > 0) { for (i = 0; i < apcFroms.NumElements(); i ++) { pcFrom = *apcFroms.Get(i); pcContainer = pcFrom->GetEmbeddingContainer(); if (!(pcContainer->miFlags & OBJECT_FLAGS_CLEARED_DIST_TO_ROOT)) { pcContainer->CollectValidDistStartingObjectsAndSetClearedToRoot(this, pcParameters); } } } apcFroms.Kill(); } else { if (pcTo != NULL) { pcParameters->AddExpectedDist(pcTo, miDistToRoot+1); } } }