00001 // -*- c++ -*- 00002 //***************************************************************************** 00060 //***************************************************************************** 00061 00062 // include basic definitions 00063 #include "pbori_defs.h" 00064 00065 #include "OrderedManager.h" 00066 00067 // get all available orderings 00068 #include "LexOrder.h" 00069 #include "DegLexOrder.h" 00070 #include "DegRevLexAscOrder.h" 00071 #include "BlockDegLexOrder.h" 00072 #include "BlockDegRevLexAscOrder.h" 00073 00074 #ifndef pbori_order_h_ 00075 #define pbori_order_h_ 00076 00077 BEGIN_NAMESPACE_PBORI 00078 00079 inline PBORI_SHARED_PTR(CDynamicOrderBase) 00080 get_ordering(CTypes::ordercode_type order) { 00081 typedef PBORI_SHARED_PTR(CDynamicOrderBase) order_ptr; 00082 00083 if(order == CTypes::lp) 00084 return order_ptr(new CDynamicOrder<LexOrder>); 00085 else if(order == CTypes::dlex) 00086 return order_ptr(new CDynamicOrder<DegLexOrder>); 00087 else if(order == CTypes::dp_asc) 00088 return order_ptr(new CDynamicOrder<DegRevLexAscOrder>); 00089 else if(order == CTypes::block_dlex) 00090 return order_ptr(new CDynamicOrder<BlockDegLexOrder>); 00091 else if(order == CTypes::block_dp_asc) 00092 return order_ptr(new CDynamicOrder<BlockDegRevLexAscOrder>); 00093 00094 // default is lex order 00095 return order_ptr(new CDynamicOrder<LexOrder>); 00096 } 00097 00098 00101 template <class LhsType, class RhsType, class BinaryPredicate> 00102 class lex_compare_predicate: 00103 public std::binary_function<LhsType, RhsType, bool> { 00104 public: 00105 00107 lex_compare_predicate(const BinaryPredicate& comp): 00108 m_comp(comp) {} 00109 00111 bool operator()(const LhsType& lhs, const RhsType& rhs) const { 00112 return std::lexicographical_compare(lhs.begin(), lhs.end(), 00113 rhs.begin(), rhs.end(), m_comp); 00114 } 00115 00116 private: 00117 BinaryPredicate m_comp; 00118 }; 00119 00120 END_NAMESPACE_PBORI 00121 00122 #endif