00001
00002
00015
00016
00017 #ifndef polybori_orderings_COrderingTags_h_
00018 #define polybori_orderings_COrderingTags_h_
00019
00020
00021 #include <polybori/pbori_defs.h>
00022
00023
00024 #include <polybori/common/tags.h>
00025 #include "order_tags.h"
00026
00027 BEGIN_NAMESPACE_PBORI
00028
00034 template <class OrderTag,
00035 class LexProp, class DegOrderProp, class BlockOrderProp,
00036 class DescendingProp,
00037 class OrderedProp = LexProp,
00038 class TotelDegOrderProp = DegOrderProp,
00039 class SymmetryProp = typename invert_tag<BlockOrderProp>::type >
00040
00041 class COrderingTagsBase {
00042 public:
00043 typedef OrderTag order_tag;
00044 typedef LexProp lex_property;
00045 typedef OrderedProp ordered_property;
00046 typedef SymmetryProp symmetry_property;
00047 typedef DegOrderProp degorder_property;
00048 typedef BlockOrderProp blockorder_property;
00049 typedef TotelDegOrderProp totaldegorder_property;
00050 typedef typename invert_tag<DescendingProp>::type ascending_property;
00051 typedef typename and_tag<DegOrderProp, ascending_property>::type
00052 degrevlexorder_property;
00053 typedef DescendingProp descending_property;
00054 };
00055
00056 template <class OrderTag, class DescProp>
00057 class CDegreeOrderingTags:
00058 public COrderingTagsBase <OrderTag,
00059 invalid_tag, valid_tag, invalid_tag, DescProp> {
00060 };
00061
00062 template <class OrderTag, class DescProp>
00063 class CBlockDegreeOrderingTags:
00064 public COrderingTagsBase <OrderTag,
00065 invalid_tag, invalid_tag, valid_tag, DescProp> {
00066 };
00067
00068 template <class OrderTag>
00069 class COrderingTags;
00070
00071 template <>
00072 class COrderingTags<lex_tag>:
00073 public COrderingTagsBase <lex_tag, valid_tag, invalid_tag, invalid_tag, valid_tag> { };
00074
00075 template <>
00076 class COrderingTags<dlex_tag>:
00077 public CDegreeOrderingTags <dlex_tag, valid_tag> { };
00078
00079
00080 template <>
00081 class COrderingTags<dp_asc_tag>:
00082 public CDegreeOrderingTags<dp_asc_tag, invalid_tag> { };
00083
00084 template <>
00085 class COrderingTags<block_dlex_tag>:
00086 public CBlockDegreeOrderingTags<block_dlex_tag, valid_tag> { };
00087
00088
00089 template <>
00090 class COrderingTags<block_dp_asc_tag>:
00091 public CBlockDegreeOrderingTags<block_dp_asc_tag, invalid_tag> { };
00092
00093 END_NAMESPACE_PBORI
00094
00095 #endif