592 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			592 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #include <gtest/gtest.h>
 | |
| #define private public
 | |
| #include "lib/container/ob_bit_set.h"
 | |
| #include "lib/utility/ob_test_util.h"
 | |
| #include "lib/container/ob_array.h"
 | |
| using namespace oceanbase::common;
 | |
| class TestBitSet: public ::testing::Test
 | |
| {
 | |
| public:
 | |
|   TestBitSet();
 | |
|   virtual ~TestBitSet();
 | |
|   virtual void SetUp();
 | |
|   virtual void TearDown();
 | |
| private:
 | |
|   // disallow copy
 | |
|   DISALLOW_COPY_AND_ASSIGN(TestBitSet);
 | |
| protected:
 | |
|   // function members
 | |
| protected:
 | |
|   // data members
 | |
| };
 | |
| 
 | |
| TestBitSet::TestBitSet()
 | |
| {
 | |
| }
 | |
| 
 | |
| TestBitSet::~TestBitSet()
 | |
| {
 | |
| }
 | |
| 
 | |
| void TestBitSet::SetUp()
 | |
| {
 | |
| }
 | |
| 
 | |
| void TestBitSet::TearDown()
 | |
| {
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, add_and_del_number)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
|   ASSERT_TRUE(OB_SUCCESS != bs.add_member(-1));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(!bs.has_member(-1));
 | |
|   ASSERT_TRUE(!bs.has_member(1));
 | |
|   ASSERT_TRUE(bs.has_member(5));
 | |
|   ASSERT_TRUE(bs.has_member(50));
 | |
| 
 | |
|   ASSERT_FALSE(OB_SUCCESS == bs.del_member(-1));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.del_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.del_member(500));
 | |
|   ASSERT_TRUE(!bs.has_member(1));
 | |
|   ASSERT_TRUE(!bs.has_member(5));
 | |
|   ASSERT_TRUE(bs.has_member(50));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, get_bitset_word)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
|   ASSERT_EQ(0, bs.get_bitset_word(-1));
 | |
|   ASSERT_EQ(0, bs.get_bitset_word(1));
 | |
|   ASSERT_EQ(0, bs.get_bitset_word(2));
 | |
|   ASSERT_EQ(0, bs.get_bitset_word(3));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(90));
 | |
| 
 | |
|   ASSERT_EQ(32, bs.get_bitset_word(0));
 | |
|   ASSERT_EQ(262144, bs.get_bitset_word(1));
 | |
|   ASSERT_EQ(67108864, bs.get_bitset_word(2));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, add_and_del_members)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
| 
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
 | |
| 
 | |
|   ObBitSet<16> bs2;
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs2.add_member(15));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs2.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs2.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs2.add_member(200));
 | |
| 
 | |
|   bs.del_members(bs2);
 | |
|   ASSERT_TRUE(bs.has_member(5));
 | |
|   ASSERT_TRUE(!bs.has_member(50));
 | |
|   ASSERT_TRUE(!bs.has_member(100));
 | |
|   ASSERT_TRUE(bs.has_member(111));
 | |
| 
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_members(bs2));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs2.add_member(200));
 | |
|   ASSERT_TRUE(bs.has_member(50));
 | |
|   ASSERT_TRUE(bs.has_member(100));
 | |
|   ASSERT_TRUE(bs.has_member(200));
 | |
|   ASSERT_TRUE(bs.has_member(15));
 | |
| 
 | |
|   ASSERT_EQ(6, bs.num_members());
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, do_mask)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.do_mask(6,101));
 | |
|   ASSERT_TRUE(bs.has_member(50));
 | |
|   ASSERT_TRUE(bs.has_member(100));
 | |
|   ASSERT_TRUE(!bs.has_member(5));
 | |
|   ASSERT_TRUE(!bs.has_member(111));
 | |
|   ASSERT_TRUE(!bs.has_member(121));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, to_string)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
|   ASSERT_TRUE(bs.is_empty());
 | |
|   OB_LOG(INFO, "TO_STRING", K(bs));
 | |
| 
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
 | |
|   ASSERT_FALSE(bs.is_empty());
 | |
|   OB_LOG(INFO, "TO_STRING", K(bs));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, set_operation)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.do_mask(5,101));
 | |
| 
 | |
|   //is_superset && is_subset
 | |
|   ObBitSet<16> bs1;
 | |
|   ASSERT_TRUE(bs.is_superset(bs1));
 | |
|   ASSERT_TRUE(bs1.is_subset(bs));
 | |
|   ASSERT_FALSE(bs1.is_superset(bs));
 | |
|   ASSERT_FALSE(bs.is_subset(bs1));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(5));
 | |
|   ASSERT_FALSE(bs1.is_superset(bs));
 | |
|   ASSERT_FALSE(bs.is_subset(bs1));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(100));
 | |
|   ASSERT_TRUE(bs.is_superset(bs1));
 | |
|   ASSERT_TRUE(bs1.is_subset(bs));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, overlap)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
|   ObBitSet<16> bs1;
 | |
|   ASSERT_FALSE(bs.overlap(bs1));
 | |
|   ASSERT_FALSE(bs1.overlap(bs));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
| 
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(51));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(101));
 | |
|   ASSERT_FALSE(bs.overlap(bs1));
 | |
|   ASSERT_FALSE(bs1.overlap(bs));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(101));
 | |
|   ASSERT_TRUE(bs.overlap(bs1));
 | |
|   ASSERT_TRUE(bs1.overlap(bs));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, number_and_clear)
 | |
| {
 | |
|   ObBitSet<128> bs;
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
 | |
|   ASSERT_EQ(4, bs.num_members());
 | |
|   ObArenaAllocator allocator("BitSet");
 | |
|   //test case with allocator
 | |
|   ObBitSet<16, ObIAllocator&> bs1(allocator);
 | |
|   ASSERT_EQ(0, bs1.bitset_word_count());
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(5));
 | |
|   ASSERT_EQ(1, bs1.bitset_word_count());
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(50));
 | |
|   ASSERT_EQ(2, bs1.bitset_word_count());
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(100));
 | |
|   ASSERT_EQ(4, bs1.bitset_word_count());
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(111));
 | |
|   ASSERT_EQ(4, bs1.bitset_word_count());
 | |
|   ASSERT_EQ(4, bs1.num_members());
 | |
|   ASSERT_EQ(4, bs1.bitset_word_count());
 | |
|   ASSERT_TRUE(bs1.has_member(5));
 | |
|   ASSERT_TRUE(bs1.has_member(50));
 | |
|   ASSERT_TRUE(bs1.has_member(100));
 | |
|   ASSERT_TRUE(bs1.has_member(111));
 | |
| 
 | |
|   bs1.reuse();
 | |
|   ASSERT_EQ(0, bs1.bitset_word_count());
 | |
|   ASSERT_TRUE(bs1.is_empty());
 | |
| 
 | |
|   ASSERT_FALSE(bs1.has_member(5));
 | |
|   ASSERT_FALSE(bs1.has_member(50));
 | |
|   ASSERT_FALSE(bs1.has_member(100));
 | |
|   ASSERT_FALSE(bs1.has_member(101));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, to_array)
 | |
| {
 | |
|   ObBitSet<128> bs;
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
 | |
|   ObArray<int64_t> arr;
 | |
|   OK(bs.to_array(arr));
 | |
|   ASSERT_EQ(4, arr.count());
 | |
|   ASSERT_EQ(5, arr.at(0));
 | |
|   ASSERT_EQ(50, arr.at(1));
 | |
|   ASSERT_EQ(100, arr.at(2));
 | |
|   ASSERT_EQ(111, arr.at(3));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, construct)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
 | |
| 
 | |
|   ObBitSet<16> bs1(bs);
 | |
|   ASSERT_TRUE(bs == bs1);
 | |
|   ASSERT_TRUE(bs1.has_member(5));
 | |
|   ASSERT_TRUE(bs1.has_member(50));
 | |
|   ASSERT_TRUE(bs1.has_member(100));
 | |
|   ASSERT_TRUE(bs1.has_member(111));
 | |
|   ASSERT_FALSE(bs1.has_member(101));
 | |
| 
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.del_member(5));
 | |
| 
 | |
|   ASSERT_FALSE(bs == bs1);
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.del_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(10));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(10));
 | |
|   ASSERT_TRUE(bs == bs1);
 | |
|   ASSERT_TRUE(bs.equal(bs1));
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, get_first_peculiar_bit)
 | |
| {
 | |
|   ObBitSet<16> bs;
 | |
|   ObBitSet<16> bs1;
 | |
|   ASSERT_EQ(-1, bs.get_first_peculiar_bit(bs1));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(10));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(10));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_EQ(5, bs.get_first_peculiar_bit(bs1));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs1.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_EQ(50, bs.get_first_peculiar_bit(bs1));
 | |
| 
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, serialize)
 | |
| {
 | |
|   ObBitSet<128> bs;
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(5));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(50));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(100));
 | |
|   ASSERT_TRUE(OB_SUCCESS == bs.add_member(111));
 | |
|   const int64_t BUF_LEN = 1024;
 | |
|   char buf[1024];
 | |
|   int64_t pos = 0;
 | |
|   int64_t pos1 = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.serialize(buf, BUF_LEN, pos));
 | |
|   ObBitSet<128> bs1;
 | |
|   ASSERT_EQ(OB_SUCCESS, bs1.deserialize(buf, BUF_LEN, pos1));
 | |
|   ASSERT_TRUE(bs.equal(bs1));
 | |
|   ASSERT_EQ(bs.get_serialize_size(), bs.get_serialize_size());
 | |
| }
 | |
| 
 | |
| TEST_F(TestBitSet, find_and_clear)
 | |
| {
 | |
|   ObBitSet<128> bs;
 | |
|   // test find next
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(0));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(5));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(32));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(52));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(63));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(64));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(121));
 | |
|   int64_t pos = 0;
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_next(-2, pos));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(-1, pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_first(pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(5, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(31, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(32, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(52, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(63, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(64, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(121, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(128, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
| 
 | |
|   // test clear all
 | |
|   bs.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_first(pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
| 
 | |
|   // test find prev
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(150, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(128, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(129, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_prev(-1, pos));
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_prev(-10, pos));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(0, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(28, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
| 
 | |
|   bs.reset();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(90));
 | |
|   bs.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(59));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(75, pos));
 | |
|   ASSERT_EQ(59, pos);
 | |
| 
 | |
|   bs.reset();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(100, pos));
 | |
|   ASSERT_EQ(1, bs.bitset_word_count());
 | |
|   ASSERT_EQ(31, pos);
 | |
| 
 | |
|   bs.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(0));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(121));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(120, pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(127, pos));
 | |
|   ASSERT_EQ(121, pos);
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(5));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(32));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(52));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(63));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(96));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(120, pos));
 | |
|   ASSERT_EQ(96, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(63, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(52, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(32, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(31, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(5, pos);
 | |
| }
 | |
| 
 | |
| 
 | |
| TEST_F(TestBitSet, find_and_clear_for_fix_bit_set)
 | |
| {
 | |
|   ObFixedBitSet<128> bs;
 | |
|   // test find next
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(0));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(5));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(32));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(52));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(63));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(64));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(121));
 | |
|   int64_t pos = 0;
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_next(-2, pos));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(-1, pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_first(pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(5, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(31, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(32, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(52, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(63, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(64, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(121, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(pos, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_next(128, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
| 
 | |
|   // test clear all
 | |
|   bs.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_first(pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
| 
 | |
|   // test find prev
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(150, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(128, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(129, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_prev(-1, pos));
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs.find_prev(-10, pos));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(0, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(28, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
| 
 | |
|   bs.reset();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(90));
 | |
|   bs.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(59));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(75, pos));
 | |
|   ASSERT_EQ(59, pos);
 | |
| 
 | |
|   bs.reset();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(100, pos));
 | |
|   ASSERT_EQ(31, pos);
 | |
| 
 | |
|   bs.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(0));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(121));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(120, pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(127, pos));
 | |
|   ASSERT_EQ(121, pos);
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(5));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(32));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(52));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(63));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.add_member(96));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(120, pos));
 | |
|   ASSERT_EQ(96, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(63, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(52, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(32, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(31, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs.find_prev(pos, pos));
 | |
|   ASSERT_EQ(5, pos);
 | |
| 
 | |
|   ObFixedBitSet<126> bs2;
 | |
|   // test find next
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(0));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(5));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(32));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(52));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(63));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(64));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(121));
 | |
|   pos = 0;
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs2.find_next(-2, pos));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(-1, pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_first(pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
 | |
|   ASSERT_EQ(5, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
 | |
|   ASSERT_EQ(31, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
 | |
|   ASSERT_EQ(32, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
 | |
|   ASSERT_EQ(52, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
 | |
|   ASSERT_EQ(63, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
 | |
|   ASSERT_EQ(64, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
 | |
|   ASSERT_EQ(121, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(pos, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_next(126, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   // test clear all
 | |
|   bs2.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_first(pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   // test find prev
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(150, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(126, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(127, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs2.find_prev(-1, pos));
 | |
|   ASSERT_EQ(OB_INVALID_ARGUMENT, bs2.find_prev(-10, pos));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(0, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(28, pos));
 | |
|   ASSERT_EQ(-1, pos);
 | |
|   bs2.reset();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(90));
 | |
|   bs2.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(59));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(75, pos));
 | |
|   ASSERT_EQ(59, pos);
 | |
|   bs2.reset();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(100, pos));
 | |
|   ASSERT_EQ(31, pos);
 | |
|   bs2.clear_all();
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(0));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(121));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(120, pos));
 | |
|   ASSERT_EQ(0, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(125, pos));
 | |
|   ASSERT_EQ(121, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(5));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(31));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(32));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(52));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(63));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.add_member(96));
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(120, pos));
 | |
|   ASSERT_EQ(96, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
 | |
|   ASSERT_EQ(63, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
 | |
|   ASSERT_EQ(52, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
 | |
|   ASSERT_EQ(32, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
 | |
|   ASSERT_EQ(31, pos);
 | |
|   ASSERT_EQ(OB_SUCCESS, bs2.find_prev(pos, pos));
 | |
|   ASSERT_EQ(5, pos);
 | |
| 
 | |
| 
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   ::testing::InitGoogleTest(&argc,argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
