00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef PHY_COMBINED_TRAVERSAL_H
00028 #define PHY_COMBINED_TRAVERSAL_H
00029
00030 #include <PVLE/Export.h>
00031 #include <PVLE/Physics/Space.h>
00032
00033 namespace Physics {
00034
00037 template<typename _Pred>
00038 void combinedTraversal(AbstractGeom & a, AbstractGeom & b, _Pred & pred) {
00039 ASSERT(a.isSpace() == b.isSpace());
00040 Geom * pCurGeomA = a.asGeom();
00041 if (pCurGeomA) {
00042
00043 if (!pred(pCurGeomA, b.asGeom())) return;
00044 } else {
00045
00046 Space * pASpace = a.asSpace();
00047 Space * pBSpace = b.asSpace();
00048 for(Space::TListGeoms::const_iterator itAGeom = pASpace->getGeomsBegin(), itAGeomEnd = pASpace->getGeomsEnd(), itAGeomCopy = pBSpace->getGeomsBegin(); itAGeom != itAGeomEnd; ++itAGeom, ++itAGeomCopy) {
00049 ASSERT(itAGeomCopy != pBSpace->getGeomsEnd());
00050 combinedTraversal(**itAGeom, **itAGeomCopy, pred);
00051 }
00052 }
00053 }
00054
00055
00056 template<typename _Pred>
00057 void combinedTraversal(const AbstractGeom & a, const AbstractGeom & b, _Pred & pred) {
00058 ASSERT(a.isSpace() == b.isSpace());
00059 const Geom * pCurGeomA = a.asGeom();
00060 if (pCurGeomA) {
00061
00062 if (!pred(pCurGeomA, b.asGeom())) return;
00063 } else {
00064
00065 const Space * pASpace = a.asSpace();
00066 const Space * pBSpace = b.asSpace();
00067 for(Space::TListGeoms::const_iterator itAGeom = pASpace->getGeomsBegin(), itAGeomEnd = pASpace->getGeomsEnd(), itAGeomCopy = pBSpace->getGeomsBegin(); itAGeom != itAGeomEnd; ++itAGeom, ++itAGeomCopy) {
00068 ASSERT(itAGeomCopy != pBSpace->getGeomsEnd());
00069 combinedTraversal(**itAGeom, **itAGeomCopy, pred);
00070 }
00071 }
00072
00073 }
00074
00075 }
00076
00077 #endif // PHY_COMBINED_TRAVERSAL_H