1 // -*- c++ -*- 2 //***************************************************************************** 3 /** @file COrderingTags.h 4 * 5 * @author Alexander Dreyer 6 * @date 2010-08-10 7 * 8 * Template class, which is a base for classes, which define ordering tags and 9 * properties. 10 * 11 * @par Copyright: 12 * (c) 2010 by The PolyBoRi Team 13 * 14 **/ 15 //***************************************************************************** 16 17 #ifndef polybori_orderings_COrderingTags_h_ 18 #define polybori_orderings_COrderingTags_h_ 19 20 // include basic definitions 21 #include <polybori/pbori_defs.h> 22 23 // include basic definitions for tags 24 #include <polybori/common/tags.h> 25 #include "order_tags.h" 26 27 BEGIN_NAMESPACE_PBORI 28 29 /** @class COrderingTags 30 * @brief This tempalte class is base for classes which define ordering tags and 31 * properties. 32 * 33 **/ 34 template <class OrderTag, 35 class LexProp, class DegOrderProp, class BlockOrderProp, 36 class DescendingProp, 37 class OrderedProp = LexProp, 38 class TotelDegOrderProp = DegOrderProp, 39 class SymmetryProp = typename invert_tag<BlockOrderProp>::type > 40 41 class COrderingTagsBase { 42 public: 43 typedef OrderTag order_tag; 44 typedef LexProp lex_property; 45 typedef OrderedProp ordered_property; 46 typedef SymmetryProp symmetry_property; 47 typedef DegOrderProp degorder_property; 48 typedef BlockOrderProp blockorder_property; 49 typedef TotelDegOrderProp totaldegorder_property; 50 typedef typename invert_tag<DescendingProp>::type ascending_property; 51 typedef typename and_tag<DegOrderProp, ascending_property>::type 52 degrevlexorder_property; 53 typedef DescendingProp descending_property; 54 }; 55 56 template <class OrderTag, class DescProp> 57 class CDegreeOrderingTags: 58 public COrderingTagsBase <OrderTag, 59 invalid_tag, valid_tag, invalid_tag, DescProp> { 60 }; 61 62 template <class OrderTag, class DescProp> 63 class CBlockDegreeOrderingTags: 64 public COrderingTagsBase <OrderTag, 65 invalid_tag, invalid_tag, valid_tag, DescProp> { 66 }; 67 68 template <class OrderTag> 69 class COrderingTags; 70 71 template <> 72 class COrderingTags<lex_tag>: 73 public COrderingTagsBase <lex_tag, valid_tag, invalid_tag, invalid_tag, valid_tag> { }; 74 75 template <> 76 class COrderingTags<dlex_tag>: 77 public CDegreeOrderingTags <dlex_tag, valid_tag> { }; 78 79 80 template <> 81 class COrderingTags<dp_asc_tag>: 82 public CDegreeOrderingTags<dp_asc_tag, invalid_tag> { }; 83 84 template <> 85 class COrderingTags<block_dlex_tag>: 86 public CBlockDegreeOrderingTags<block_dlex_tag, valid_tag> { }; 87 88 89 template <> 90 class COrderingTags<block_dp_asc_tag>: 91 public CBlockDegreeOrderingTags<block_dp_asc_tag, invalid_tag> { }; 92 93 END_NAMESPACE_PBORI 94 95 #endif 96