00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef PPL_Saturation_Row_inlines_hh
00024 #define PPL_Saturation_Row_inlines_hh 1
00025
00026 #include <cassert>
00027
00028 #include <cstring>
00029
00030 namespace Parma_Polyhedra_Library {
00031
00032 inline
00033 Saturation_Row::Saturation_Row() {
00034 mpz_init(vec);
00035 }
00036
00037 inline
00038 Saturation_Row::Saturation_Row(const Saturation_Row& y) {
00039 mpz_init_set(vec, y.vec);
00040 }
00041
00042 inline
00043 Saturation_Row::~Saturation_Row() {
00044 mpz_clear(vec);
00045 }
00046
00047 inline Saturation_Row&
00048 Saturation_Row::operator=(const Saturation_Row& y) {
00049 mpz_set(vec, y.vec);
00050 return *this;
00051 }
00052
00053 inline void
00054 Saturation_Row::set(const unsigned long k) {
00055 mpz_setbit(vec, k);
00056 }
00057
00058 inline void
00059 Saturation_Row::clear(const unsigned long k) {
00060 mpz_clrbit(vec, k);
00061 }
00062
00063 inline void
00064 Saturation_Row::clear_from(const unsigned long k) {
00065 mpz_tdiv_r_2exp(vec, vec, k);
00066 }
00067
00068 inline unsigned long
00069 Saturation_Row::count_ones() const {
00070 assert(vec->_mp_size >= 0);
00071 return mpn_popcount(vec->_mp_d, vec->_mp_size);
00072 }
00073
00074 inline bool
00075 Saturation_Row::empty() const {
00076 return mpz_sgn(vec) == 0;
00077 }
00078
00079 inline void
00080 Saturation_Row::swap(Saturation_Row& y) {
00081 mpz_swap(vec, y.vec);
00082 }
00083
00084 inline void
00085 Saturation_Row::clear() {
00086 mpz_set_ui(vec, 0UL);
00087 }
00088
00089 inline memory_size_type
00090 Saturation_Row::external_memory_in_bytes() const {
00091 return vec[0]._mp_alloc * SIZEOF_MP_LIMB_T;
00092 }
00093
00094 inline memory_size_type
00095 Saturation_Row::total_memory_in_bytes() const {
00096 return sizeof(*this) + external_memory_in_bytes();
00097 }
00098
00099 #if HAVE_DECL_FFS && SIZEOF_MP_LIMB_T == SIZEOF_INT
00100
00101 inline unsigned int
00102 Saturation_Row::first_one(mp_limb_t w) {
00103 return ffs(w)-1;
00104 }
00105
00106 #endif
00107
00109 inline void
00110 set_union(const Saturation_Row& x, const Saturation_Row& y,
00111 Saturation_Row& z) {
00112 mpz_ior(z.vec, x.vec, y.vec);
00113 }
00114
00115 }
00116
00117
00118 namespace std {
00119
00121 inline void
00122 swap(Parma_Polyhedra_Library::Saturation_Row& x,
00123 Parma_Polyhedra_Library::Saturation_Row& y) {
00124 x.swap(y);
00125 }
00126
00128 inline void
00129 iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
00130 std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y) {
00131 swap(*x, *y);
00132 }
00133
00134 }
00135
00136 #endif // !defined(PPL_Saturation_Row_inlines_hh)