summaryrefslogtreecommitdiff
path: root/trunk/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h')
-rw-r--r--trunk/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/trunk/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h b/trunk/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h
new file mode 100644
index 00000000000..46f668814bf
--- /dev/null
+++ b/trunk/TAO/orbsvcs/orbsvcs/Notify/Bit_Vector.h
@@ -0,0 +1,81 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Bit_Vector.h
+ *
+ * $Id$
+ *
+ * This is a basic bit vector class.
+ *
+ * @author Jonathan Pollack <pollack_j@ociweb.com>
+ */
+//=============================================================================
+
+#ifndef BIT_VECTOR_H
+#define BIT_VECTOR_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/Versioned_Namespace.h"
+
+#include "ace/Vector_T.h"
+#include "ace/Basic_Types.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace TAO_Notify
+{
+
+/// \brief Simple bit vector.
+///
+/// Written to support block allocation from persistent storage.
+/// Should be promoted to the ACE level to make it generally usable.
+class TAO_Notify_Serv_Export Bit_Vector
+{
+ typedef ACE_UINT32 BASIC_UINT_TYPE;
+ typedef ACE_Vector<BASIC_UINT_TYPE> VECTOR_TYPE;
+ enum {
+ BITS_PER_WORD = 32,
+ BPW_LOG_2 = 5
+ };
+public:
+
+ /// The constructor.
+ Bit_Vector();
+ /// The destructor.
+ ~Bit_Vector();
+
+ /// \brief Determine if a bit at location is set.
+ bool is_set(const size_t location) const;
+ /// \brief Set or unset a bit at location, growing the vector as needed.
+ void set_bit(const size_t location, bool set);
+
+ /// \brief Find the first bit that is either set or unset in an O(1).
+ size_t find_first_bit(bool set) const;
+
+private:
+ /// Update our first set and unset bits.
+ void evaluate_firsts(const size_t location, bool set);
+ /// Iterate from location to the end, finding the first bit that
+ /// matches the requested set or unset value.
+ size_t find_first_bit_of(const size_t location, bool set);
+
+private:
+ VECTOR_TYPE bitvec_;
+ size_t size_;
+ size_t first_set_bit_;
+ size_t first_cleared_bit_;
+};
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* BIT_VECTOR_H */