PolyBoRi
BitMask.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
14 //*****************************************************************************
15 
16 #ifndef polybori_groebner_BitMask_h_
17 #define polybori_groebner_BitMask_h_
18 
19 // include basic definitions
20 #include "groebner_defs.h"
21 
23 
29 template <unsigned NBits>
30 class BitMask;
31 
32 template <>
33 class BitMask<0> {
34 public:
35  enum { nbits = 0, mask = (unsigned long)0 };
36 
37  unsigned long low(const unsigned long& value) const { return 0; }
38  const unsigned long& high(const unsigned long& value) const { return value; }
39  const unsigned long& shift(const unsigned long& value) const { return value; }
40  unsigned long back(const unsigned long& value) const { return 0; }
41 };
42 
43 
44 template <unsigned NBits>
45 class BitMask {
46 public:
47  enum { nbits = NBits, mask = ((unsigned long)(BitMask<nbits-1>::mask) << 1) | 0x1};
48 
49  unsigned long low(const unsigned long& value) const {
50  return value & mask;
51  }
52  unsigned long high(const unsigned long& value) const {
53  return value >> NBits;
54  }
55  unsigned long shift(const unsigned long& value) const {
56  return value << NBits;
57  }
58  unsigned long back(const unsigned long& value) const {
59  return value << (sizeof(unsigned long)*8 - NBits);
60  }
61 };
62 
63 template <>
64 class BitMask<sizeof(unsigned long)*8> {
65 public:
66  enum { nbits = sizeof(unsigned long)*8,
67  mask = ((unsigned long)(BitMask<nbits-1>::mask) << 1) | 0x1};
68 
69  const unsigned long& low(const unsigned long& value) const { return value; }
70  unsigned long high(const unsigned long& value) const { return 0; }
71  unsigned long shift(const unsigned long& value) const { return 0; }
72  const unsigned long& back(const unsigned long& value) const { return value; }
73 };
74 
76 
77 #endif /* polybori_groebner_BitMask_h_ */
unsigned long back(const unsigned long &value) const
Definition: BitMask.h:58
const unsigned long & low(const unsigned long &value) const
Definition: BitMask.h:69
unsigned long high(const unsigned long &value) const
Definition: BitMask.h:70
const unsigned long & high(const unsigned long &value) const
Definition: BitMask.h:38
unsigned long low(const unsigned long &value) const
Definition: BitMask.h:37
#define END_NAMESPACE_PBORIGB
Definition: groebner_defs.h:16
unsigned long high(const unsigned long &value) const
Definition: BitMask.h:52
unsigned long back(const unsigned long &value) const
Definition: BitMask.h:40
#define BEGIN_NAMESPACE_PBORIGB
Definition: groebner_defs.h:15
const unsigned long & back(const unsigned long &value) const
Definition: BitMask.h:72
unsigned long shift(const unsigned long &value) const
Definition: BitMask.h:55
const unsigned long & shift(const unsigned long &value) const
Definition: BitMask.h:39
unsigned long low(const unsigned long &value) const
Definition: BitMask.h:49
unsigned long shift(const unsigned long &value) const
Definition: BitMask.h:71
This class defines a bit mask and related operations.
Definition: BitMask.h:30