summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp b/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp
new file mode 100644
index 00000000000..fd77791b525
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.cpp
@@ -0,0 +1,114 @@
+// $Id$
+
+#include "orbsvcs/Notify/Bit_Vector.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+Bit_Vector::Bit_Vector()
+ : size_(0)
+ , first_set_bit_(0)
+ , first_cleared_bit_(0)
+{
+}
+
+Bit_Vector::~Bit_Vector()
+{
+}
+
+bool
+Bit_Vector::is_set(const size_t location) const
+{
+ bool result = false;
+ if (location < this->size_)
+ {
+ result = (0 != (this->bitvec_[location >> BPW_LOG_2] & (1 << (location % BITS_PER_WORD))));
+ }
+ return result;
+}
+
+void
+Bit_Vector::set_bit(const size_t location, bool set)
+{
+ if (location >= this->size_)
+ {
+ if ((location >> BPW_LOG_2) >= (this->size_ >> BPW_LOG_2))
+ {
+ size_t need = (location >> BPW_LOG_2) - (this->size_ >> BPW_LOG_2);
+ this->bitvec_.resize(this->bitvec_.size() + need + 1, 0);
+ }
+ this->size_ = location + 1;
+ }
+ if (set)
+ {
+ this->bitvec_[location >> BPW_LOG_2] |= (1 << (location % BITS_PER_WORD));
+ }
+ else
+ {
+ this->bitvec_[location >> BPW_LOG_2] &= ~(1 << (location % BITS_PER_WORD));
+ }
+ this->evaluate_firsts(location, set);
+}
+
+size_t
+Bit_Vector::find_first_bit(bool set) const
+{
+ size_t result = 0;
+ if (set)
+ {
+ result = this->first_set_bit_;
+ }
+ else
+ {
+ result = this->first_cleared_bit_;
+ }
+ return result;
+}
+
+void
+Bit_Vector::evaluate_firsts(const size_t location, bool set)
+{
+ if (set)
+ {
+ if (this->first_cleared_bit_ == location)
+ {
+ this->first_cleared_bit_ = this->find_first_bit_of(location, false);
+ }
+ if (this->first_set_bit_ > location)
+ {
+ this->first_set_bit_ = location;
+ }
+ }
+ else if (!set)
+ {
+ if (this->first_set_bit_ == location)
+ {
+ this->first_set_bit_ = this->find_first_bit_of(location, true);
+ }
+ if (this->first_cleared_bit_ > location)
+ {
+ this->first_cleared_bit_ = location;
+ }
+ }
+}
+
+size_t
+Bit_Vector::find_first_bit_of(const size_t location, bool set)
+{
+ size_t newloc = 0;
+ size_t idx = 0;
+ for (idx = location; (newloc == 0) && (idx < this->size_ + 1); idx++)
+ {
+ if (is_set(idx) == set)
+ {
+ newloc = idx;
+ }
+ }
+ return newloc;
+}
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL