1 // -*- c++ -*-
2 //*****************************************************************************
3 /** @file pbori_order.h
4  *
5  * @author Alexander Dreyer
6  * @date 2006-05-23
7  *
8  *
9  *
10  * @par Copyright:
11  *   (c) 2006 by The PolyBoRi Team
12 **/
13 //*****************************************************************************
14 
15 #ifndef polybori_orderings_pbori_order_h_
16 #define polybori_orderings_pbori_order_h_
17 
18 // include basic definitions
19 #include <polybori/pbori_defs.h>
20 
21 // Get infrastructure for dynamic orderings
22 #include "COrderingBase.h"
23 
24 // get all available orderings
25 #include <polybori/LexOrder.h>
26 #include <polybori/DegLexOrder.h>
27 #include <polybori/DegRevLexAscOrder.h>
28 #include <polybori/BlockDegLexOrder.h>
29 #include <polybori/BlockDegRevLexAscOrder.h>
30 
31 BEGIN_NAMESPACE_PBORI
32 
33 inline std::shared_ptr<COrderingBase>
get_ordering(CTypes::ordercode_type order)34 get_ordering(CTypes::ordercode_type order) {
35   typedef std::shared_ptr<COrderingBase> order_ptr;
36 
37   if(order == CTypes::lp)
38     return order_ptr(new LexOrder);
39   else if(order == CTypes::dlex)
40     return order_ptr(new DegLexOrder);
41   else if(order == CTypes::dp_asc)
42     return order_ptr(new DegRevLexAscOrder);
43   else if(order == CTypes::block_dlex)
44     return order_ptr(new BlockDegLexOrder);
45   else if(order == CTypes::block_dp_asc)
46      return order_ptr(new BlockDegRevLexAscOrder);
47 
48   // default is lex order
49   return order_ptr(new LexOrder);
50 }
51 
52 
53 /// @class lex_compare_predicate
54 /// @brief defines lexicographic comparison functor
55 template <class LhsType, class RhsType, class BinaryPredicate>
56 class lex_compare_predicate:
57   public std::binary_function<LhsType, RhsType, bool> {
58 public:
59 
60   /// Constructor
lex_compare_predicate(const BinaryPredicate & comp)61   lex_compare_predicate(const BinaryPredicate& comp):
62     m_comp(comp) {}
63 
64   /// Functor operation
operator()65   bool operator()(const LhsType& lhs, const RhsType& rhs) const {
66     return std::lexicographical_compare(lhs.begin(), lhs.end(),
67                                         rhs.begin(), rhs.end(), m_comp);
68   }
69 
70 private:
71   BinaryPredicate m_comp;
72 };
73 
74 END_NAMESPACE_PBORI
75 
76 #endif
77