PolyBoRi
BitMask.h
Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00014 //*****************************************************************************
00015 
00016 #ifndef polybori_groebner_BitMask_h_
00017 #define polybori_groebner_BitMask_h_
00018 
00019 // include basic definitions
00020 #include "groebner_defs.h"
00021 
00022 BEGIN_NAMESPACE_PBORIGB
00023 
00029 template <unsigned NBits>
00030 class BitMask;
00031 
00032 template <>
00033 class BitMask<0> {
00034 public:
00035   enum { nbits = 0, mask = (unsigned long)0 };
00036 
00037   unsigned long low(const unsigned long& value) const { return 0; }
00038   const unsigned long& high(const unsigned long& value) const { return value; }
00039   const unsigned long& shift(const unsigned long& value) const { return value; }
00040   unsigned long back(const unsigned long& value) const { return 0; }
00041 };
00042 
00043 
00044 template <unsigned NBits>
00045 class BitMask {
00046 public:
00047   enum { nbits = NBits, mask = ((unsigned long)(BitMask<nbits-1>::mask) << 1) | 0x1};
00048 
00049   unsigned long low(const unsigned long& value) const {
00050     return value & mask;
00051   }
00052   unsigned long high(const unsigned long& value) const {
00053     return value >> NBits;
00054   }
00055   unsigned long shift(const unsigned long& value) const {
00056     return value << NBits;
00057   }
00058   unsigned long back(const unsigned long& value) const {
00059     return value << (sizeof(unsigned long)*8 - NBits);
00060   }
00061 };
00062 
00063 template <>
00064 class BitMask<sizeof(unsigned long)*8> {
00065 public:
00066   enum { nbits = sizeof(unsigned long)*8,
00067          mask =  ((unsigned long)(BitMask<nbits-1>::mask) << 1) | 0x1};
00068 
00069   const unsigned long& low(const unsigned long& value) const { return value; }
00070   unsigned long high(const unsigned long& value) const { return 0; }
00071   unsigned long shift(const unsigned long& value) const { return 0; }
00072   const unsigned long& back(const unsigned long& value) const { return value; }
00073 };
00074 
00075 END_NAMESPACE_PBORIGB
00076 
00077 #endif /* polybori_groebner_BitMask_h_ */