|
PolyBoRi
|
00001 // -*- c++ -*- 00002 //***************************************************************************** 00057 //***************************************************************************** 00058 00059 // include basic definitions 00060 #include "pbori_defs.h" 00061 #include "pbori_order.h" 00062 #include "pbori_algo.h" 00063 #include "pbori_traits.h" 00064 00065 #include "CRestrictedIter.h" 00066 00067 BEGIN_NAMESPACE_PBORI 00068 00069 00070 00071 00072 template <class FirstIterator, class SecondIterator, class BinaryPredicate> 00073 =ss="keywordflow">return init; 00957 } 00958 00959 template <class CacheType, class NaviType, class SetType> 00960 SetType 00961 dd_first_multiples_of(const CacheType& cache_mgr, 00962 NaviType navi, NaviType rhsNavi, SetType init){ 00963 00964 typedef typename SetType::dd_type dd_type; 00965 00966 if(rhsNavi.isConstant()) 00967 if(rhsNavi.terminalValue()) 00968 return cache_mgr.generate(navi); 00969 else 00970 return cache_mgr.generate(rhsNavi); 00971 00972 if (navi.isConstant() || (*navi > *rhsNavi)) 00973 return cache_mgr.zero(); 00974 00975 if (*navi == *rhsNavi) 00976 return dd_first_multiples_of(cache_mgr, navi.thenBranch(), 00977 rhsNavi.thenBranch(), init).change(*navi); 00978 00979 // Look up old result - if any 00980 NaviType result = cache_mgr.find(navi, rhsNavi); 00981 00982 if (result.isValid()) 00983 return cache_mgr.generate(result); 00984 00985 // Compute new result 00986 init = dd_type(*navi, 00987 dd_first_multiples_of(cache_mgr, navi.thenBranch(), 00988 rhsNavi, init).diagram(), 00989 dd_first_multiples_of(cache_mgr, navi.elseBranch(), 00990 rhsNavi, init).diagram() ); 00991 00992 // Insert new result in cache 00993 cache_mgr.insert(navi, rhsNavi, init.navigation()); 00994 00995 return init; 00996 } 00997 00998 00999 END_NAMESPACE_PBORI
1.7.6.1