[PPL-devel] [GIT] ppl/ppl(master): New constructor Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z).
Roberto Bagnara
bagnara at cs.unipr.it
Mon Apr 20 15:01:14 CEST 2009
Module: ppl/ppl
Branch: master
Commit: 03552e3fe4336c7c194c8b8decd092794e0977c8
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=03552e3fe4336c7c194c8b8decd092794e0977c8
Author: Roberto Bagnara <bagnara at cs.unipr.it>
Date: Mon Apr 20 14:43:58 2009 +0200
New constructor Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z).
Constructs an object containing the set-union of y and z.
---
src/Bit_Row.cc | 26 ++++++++++++++++++++++++++
src/Bit_Row.defs.hh | 13 +++++++++++++
src/Bit_Row.inlines.hh | 14 ++++++++++++++
3 files changed, 53 insertions(+), 0 deletions(-)
diff --git a/src/Bit_Row.cc b/src/Bit_Row.cc
index eee1cbf..e1d2e0f 100644
--- a/src/Bit_Row.cc
+++ b/src/Bit_Row.cc
@@ -376,3 +376,29 @@ PPL::Bit_Row::OK() const {
&& vec_alloc >= vec_size
&& (vec_size == 0 || mpz_getlimbn(vec, vec_size-1) != 0);
}
+
+void
+PPL::Bit_Row::union_helper(const Bit_Row& y, const Bit_Row& z) {
+ mp_size_t y_size = y.vec->_mp_size;
+ mp_size_t z_size = z.vec->_mp_size;
+ assert(y_size <= z.size);
+ assert(vec->_mp_alloc >= z.size);
+ vec->_mp_size = z_size;
+ mp_srcptr yp = y.vec->_mp_d;
+ mp_srcptr zp = z.vec->_mp_d;
+ mp_ptr p = vec->_mp_d;
+ z_size -= y_size;
+ while (y_size > 0) {
+ *p = *yp | * zp;
+ ++yp;
+ ++zp;
+ ++p;
+ --y_size;
+ }
+ while (z_size > 0) {
+ *p = *zp;
+ ++zp;
+ ++p;
+ --z_size;
+ }
+}
diff --git a/src/Bit_Row.defs.hh b/src/Bit_Row.defs.hh
index 613046e..ce278c9 100644
--- a/src/Bit_Row.defs.hh
+++ b/src/Bit_Row.defs.hh
@@ -116,6 +116,12 @@ public:
//! Copy-constructor.
Bit_Row(const Bit_Row& y);
+ //! Set-union constructor.
+ /*!
+ Constructs an object containing the set-union of \p y and \p z.
+ */
+ Bit_Row(const Bit_Row& y, const Bit_Row& z);
+
//! Destructor.
~Bit_Row();
@@ -191,6 +197,13 @@ private:
//! Bit-vector representing the row.
mpz_t vec;
+ //! Assigns to \p *this the union of \p y and \p z.
+ /*!
+ The size of \p y must be be less than or equal to the size of \p z.
+ Upon entry, \p vec must have allocated enough space to contain the result.
+ */
+ void union_helper(const Bit_Row& x, const Bit_Row& y);
+
//! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
static unsigned int first_one(mp_limb_t w);
diff --git a/src/Bit_Row.inlines.hh b/src/Bit_Row.inlines.hh
index 6fc36f7..5321f41 100644
--- a/src/Bit_Row.inlines.hh
+++ b/src/Bit_Row.inlines.hh
@@ -46,6 +46,20 @@ Bit_Row::Bit_Row(const Bit_Row& y) {
}
inline
+Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z) {
+ const mp_size_t y_size = y.vec->_mp_size;
+ const mp_size_t z_size = z.vec->_mp_size;
+ if (y_size < z_size) {
+ mpz_init2(vec, z_size);
+ union_helper(y, z);
+ }
+ else {
+ mpz_init2(vec, y_size);
+ union_helper(z, y);
+ }
+}
+
+inline
Bit_Row::~Bit_Row() {
mpz_clear(vec);
}
More information about the PPL-devel
mailing list