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