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