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_Bit_Row_inlines_hh
00024 #define PPL_Bit_Row_inlines_hh 1
00025
00026 #include "globals.defs.hh"
00027 #include <cassert>
00028
00029 #include <strings.h>
00030
00031 namespace Parma_Polyhedra_Library {
00032
00033 inline
00034 Bit_Row::Bit_Row() {
00035 mpz_init(vec);
00036 }
00037
00038 inline
00039 Bit_Row::Bit_Row(const Bit_Row& y) {
00040 mpz_init_set(vec, y.vec);
00041 }
00042
00043 inline
00044 Bit_Row::~Bit_Row() {
00045 mpz_clear(vec);
00046 }
00047
00048 inline Bit_Row&
00049 Bit_Row::operator=(const Bit_Row& y) {
00050 mpz_set(vec, y.vec);
00051 return *this;
00052 }
00053
00054 inline void
00055 Bit_Row::set(const unsigned long k) {
00056 mpz_setbit(vec, k);
00057 }
00058
00059 inline void
00060 Bit_Row::clear(const unsigned long k) {
00061 mpz_clrbit(vec, k);
00062 }
00063
00064 inline void
00065 Bit_Row::clear_from(const unsigned long k) {
00066 mpz_tdiv_r_2exp(vec, vec, k);
00067 }
00068
00069 inline unsigned long
00070 Bit_Row::count_ones() const {
00071 assert(vec->_mp_size >= 0);
00072 return mpn_popcount(vec->_mp_d, vec->_mp_size);
00073 }
00074
00075 inline bool
00076 Bit_Row::empty() const {
00077 return mpz_sgn(vec) == 0;
00078 }
00079
00080 inline void
00081 Bit_Row::swap(Bit_Row& y) {
00082 mpz_swap(vec, y.vec);
00083 }
00084
00085 inline void
00086 Bit_Row::clear() {
00087 mpz_set_ui(vec, 0UL);
00088 }
00089
00090 inline memory_size_type
00091 Bit_Row::external_memory_in_bytes() const {
00092 return vec[0]._mp_alloc * PPL_SIZEOF_MP_LIMB_T;
00093 }
00094
00095 inline memory_size_type
00096 Bit_Row::total_memory_in_bytes() const {
00097 return sizeof(*this) + external_memory_in_bytes();
00098 }
00099
00100 #if PPL_HAVE_DECL_FFS && PPL_SIZEOF_MP_LIMB_T == PPL_SIZEOF_INT
00101
00102 inline unsigned int
00103 Bit_Row::first_one(mp_limb_t w) {
00104 return ffs(w)-1;
00105 }
00106
00107 #endif
00108
00110 inline void
00111 set_union(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
00112 mpz_ior(z.vec, x.vec, y.vec);
00113 }
00114
00116 inline void
00117 set_intersection(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
00118 mpz_and(z.vec, x.vec, y.vec);
00119 }
00120
00122 inline void
00123 set_difference(const Bit_Row& x, const Bit_Row& y, Bit_Row& z) {
00124 DIRTY_TEMP0(mpz_class, complement_y);
00125 mpz_com(complement_y.get_mpz_t(), y.vec);
00126 mpz_and(z.vec, x.vec, complement_y.get_mpz_t());
00127 }
00128
00129 }
00130
00131
00132 namespace std {
00133
00135 inline void
00136 swap(Parma_Polyhedra_Library::Bit_Row& x,
00137 Parma_Polyhedra_Library::Bit_Row& y) {
00138 x.swap(y);
00139 }
00140
00142 inline void
00143 iter_swap(std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator x,
00144 std::vector<Parma_Polyhedra_Library::Bit_Row>::iterator y) {
00145 swap(*x, *y);
00146 }
00147
00148 }
00149
00150 #endif // !defined(PPL_Bit_Row_inlines_hh)