aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chilbert/BigBitVec.hpp15
-rw-r--r--chilbert/FixBitVec.hpp2
-rw-r--r--test/test_bitvec.cpp20
3 files changed, 37 insertions, 0 deletions
diff --git a/chilbert/BigBitVec.hpp b/chilbert/BigBitVec.hpp
index 30b8f82..dcc2c99 100644
--- a/chilbert/BigBitVec.hpp
+++ b/chilbert/BigBitVec.hpp
@@ -108,6 +108,21 @@ public:
bool operator!=(const CBigBitVec& vec) const { return !(*this == vec); }
+ bool operator<(const CBigBitVec& vec) const
+ {
+ assert(size() == vec.size());
+
+ for (size_t ri = 0; ri < m_iRacks; ++ri) {
+ size_t i = m_iRacks - ri - 1;
+ if (m_pcRacks[i] < vec.m_pcRacks[i]) {
+ return true;
+ } else if (m_pcRacks[i] > vec.m_pcRacks[i]) {
+ return false;
+ }
+ }
+ return false;
+ }
+
/// Non-resizing assignment
CBigBitVec& operator=(const CBigBitVec& vec)
{
diff --git a/chilbert/FixBitVec.hpp b/chilbert/FixBitVec.hpp
index 05dae1f..d098956 100644
--- a/chilbert/FixBitVec.hpp
+++ b/chilbert/FixBitVec.hpp
@@ -115,6 +115,8 @@ public:
return m_rack != vec.m_rack;
}
+ bool operator<(const CFixBitVec& vec) const { return m_rack < vec.m_rack; }
+
CFixBitVec& operator=(const FBV_UINT i)
{
m_rack = i;
diff --git a/test/test_bitvec.cpp b/test/test_bitvec.cpp
index 61685d1..8305675 100644
--- a/test/test_bitvec.cpp
+++ b/test/test_bitvec.cpp
@@ -248,6 +248,25 @@ test_gray_code()
template <class T, size_t N>
void
+test_comparison()
+{
+ T a = make_zero_bitvec<T, N>();
+ T b = make_zero_bitvec<T, N>();
+
+ for (size_t bit = 1; bit < N; ++bit) {
+ setBit(a, bit, 1);
+
+ for (size_t i = 0; i < bit; ++i) {
+ setBit(a, i, rand() % 2 == 0);
+ setBit(b, i, rand() % 2 == 0);
+ }
+
+ assert(b < a);
+ }
+}
+
+template <class T, size_t N>
+void
test()
{
test_and<T, N>();
@@ -264,6 +283,7 @@ test()
test_right_shift<T, N>();
test_find_first<T, N>();
test_gray_code<T, N>();
+ test_comparison<T, N>();
}
int