1413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom/*
2413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * Copyright (C) 2013 The Android Open Source Project
3413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom *
4413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License");
5413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * you may not use this file except in compliance with the License.
6413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * You may obtain a copy of the License at
7413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom *
8413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom *      http://www.apache.org/licenses/LICENSE-2.0
9413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom *
10413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * Unless required by applicable law or agreed to in writing, software
11413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS,
12413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * See the License for the specific language governing permissions and
14413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom * limitations under the License.
15413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom */
16413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
17700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <memory>
18700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers
19e77493c7217efdd1a0ecef521a6845a13da0305bIan Rogers#include "allocator.h"
20e77493c7217efdd1a0ecef521a6845a13da0305bIan Rogers#include "bit_vector-inl.h"
21ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom#include "gtest/gtest.h"
22413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
23413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstromnamespace art {
24413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
25413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian CarlstromTEST(BitVector, Test) {
26413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  const size_t kBits = 32;
27413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
28413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  BitVector bv(kBits, false, Allocator::GetMallocAllocator());
29413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(1U, bv.GetStorageSize());
30ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  EXPECT_EQ(sizeof(uint32_t), bv.GetSizeOf());
31413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_FALSE(bv.IsExpandable());
32413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
33ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(0U, bv.NumSetBits());
34d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(0U, bv.NumSetBits(1));
35d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(0U, bv.NumSetBits(kBits));
36413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  for (size_t i = 0; i < kBits; i++) {
37413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom    EXPECT_FALSE(bv.IsBitSet(i));
38413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  }
39413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0U, bv.GetRawStorageWord(0));
40413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0U, *bv.GetRawStorage());
41413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
42a5b8fde2d2bc3167078694fad417fddfe442a6fdVladimir Marko  EXPECT_TRUE(bv.Indexes().begin().Done());
43a5b8fde2d2bc3167078694fad417fddfe442a6fdVladimir Marko  EXPECT_TRUE(bv.Indexes().begin() == bv.Indexes().end());
44413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
45413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  bv.SetBit(0);
46413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  bv.SetBit(kBits - 1);
47ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(2U, bv.NumSetBits());
48d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(1U, bv.NumSetBits(1));
49d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(2U, bv.NumSetBits(kBits));
50413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_TRUE(bv.IsBitSet(0));
51413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  for (size_t i = 1; i < kBits - 1; i++) {
52413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom    EXPECT_FALSE(bv.IsBitSet(i));
53413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  }
54413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_TRUE(bv.IsBitSet(kBits - 1));
55413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x80000001U, bv.GetRawStorageWord(0));
56413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x80000001U, *bv.GetRawStorage());
57413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
58a5b8fde2d2bc3167078694fad417fddfe442a6fdVladimir Marko  BitVector::IndexIterator iterator = bv.Indexes().begin();
59a5b8fde2d2bc3167078694fad417fddfe442a6fdVladimir Marko  EXPECT_TRUE(iterator != bv.Indexes().end());
60040719630f33019693b5c4d9b573311b2f935c39Vladimir Marko  EXPECT_EQ(0u, *iterator);
61a5b8fde2d2bc3167078694fad417fddfe442a6fdVladimir Marko  ++iterator;
62a5b8fde2d2bc3167078694fad417fddfe442a6fdVladimir Marko  EXPECT_TRUE(iterator != bv.Indexes().end());
63040719630f33019693b5c4d9b573311b2f935c39Vladimir Marko  EXPECT_EQ(kBits - 1u, *iterator);
64a5b8fde2d2bc3167078694fad417fddfe442a6fdVladimir Marko  ++iterator;
65a5b8fde2d2bc3167078694fad417fddfe442a6fdVladimir Marko  EXPECT_TRUE(iterator == bv.Indexes().end());
66413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom}
67413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
68413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian CarlstromTEST(BitVector, NoopAllocator) {
69413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  const uint32_t kWords = 2;
70413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
71413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  uint32_t bits[kWords];
72413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  memset(bits, 0, sizeof(bits));
73413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
74067f1ed7816cf4eb5d6258ca31b387ddb2073ab7Andreas Gampe  BitVector bv(false, Allocator::GetNoopAllocator(), kWords, bits);
75413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(kWords, bv.GetStorageSize());
76ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers  EXPECT_EQ(kWords * sizeof(uint32_t), bv.GetSizeOf());
77413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(bits, bv.GetRawStorage());
78ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(0U, bv.NumSetBits());
79413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
80413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  bv.SetBit(8);
81ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(1U, bv.NumSetBits());
82413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x00000100U, bv.GetRawStorageWord(0));
83413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x00000000U, bv.GetRawStorageWord(1));
84ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(1U, bv.NumSetBits());
85413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
86413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  bv.SetBit(16);
87ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(2U, bv.NumSetBits());
88413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x00010100U, bv.GetRawStorageWord(0));
89413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x00000000U, bv.GetRawStorageWord(1));
90ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(2U, bv.NumSetBits());
91413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
92413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  bv.SetBit(32);
93ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(3U, bv.NumSetBits());
94413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x00010100U, bv.GetRawStorageWord(0));
95413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x00000001U, bv.GetRawStorageWord(1));
96ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(3U, bv.NumSetBits());
97413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
98413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  bv.SetBit(48);
99ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(4U, bv.NumSetBits());
100413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x00010100U, bv.GetRawStorageWord(0));
101413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom  EXPECT_EQ(0x00010001U, bv.GetRawStorageWord(1));
102ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(4U, bv.NumSetBits());
103ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom
104d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(0U, bv.NumSetBits(1));
105ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom
106d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(0U, bv.NumSetBits(8));
107ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(1U, bv.NumSetBits(9));
108d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(1U, bv.NumSetBits(10));
109ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom
110d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(1U, bv.NumSetBits(16));
111ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(2U, bv.NumSetBits(17));
112d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(2U, bv.NumSetBits(18));
113ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom
114d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(2U, bv.NumSetBits(32));
115ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(3U, bv.NumSetBits(33));
116d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(3U, bv.NumSetBits(34));
117ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom
118d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(3U, bv.NumSetBits(48));
119ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom  EXPECT_EQ(4U, bv.NumSetBits(49));
120d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(4U, bv.NumSetBits(50));
121ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom
122d3c5bebcb52a67cb06e7ab303eaf45f230c08b60Vladimir Marko  EXPECT_EQ(4U, bv.NumSetBits(64));
123413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom}
124413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom
1254812d436ebf538043a7827253b2e940a52a43fcbVladimir MarkoTEST(BitVector, SetInitialBits) {
1264812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  const uint32_t kWords = 2;
1274812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko
1284812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  uint32_t bits[kWords];
1294812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  memset(bits, 0, sizeof(bits));
1304812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko
131067f1ed7816cf4eb5d6258ca31b387ddb2073ab7Andreas Gampe  BitVector bv(false, Allocator::GetNoopAllocator(), kWords, bits);
1324812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  bv.SetInitialBits(0u);
1334812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  EXPECT_EQ(0u, bv.NumSetBits());
1344812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  bv.SetInitialBits(1u);
1354812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  EXPECT_EQ(1u, bv.NumSetBits());
1364812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  bv.SetInitialBits(32u);
1374812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  EXPECT_EQ(32u, bv.NumSetBits());
1384812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  bv.SetInitialBits(63u);
1394812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  EXPECT_EQ(63u, bv.NumSetBits());
1404812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  bv.SetInitialBits(64u);
1414812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko  EXPECT_EQ(64u, bv.NumSetBits());
1424812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko}
1434812d436ebf538043a7827253b2e940a52a43fcbVladimir Marko
144b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas GeoffrayTEST(BitVector, UnionIfNotIn) {
145b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray  {
146b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    BitVector first(2, true, Allocator::GetMallocAllocator());
147b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    BitVector second(5, true, Allocator::GetMallocAllocator());
148b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    BitVector third(5, true, Allocator::GetMallocAllocator());
149b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray
150b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    second.SetBit(64);
151b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    third.SetBit(64);
152b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    bool changed = first.UnionIfNotIn(&second, &third);
153b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    EXPECT_EQ(0u, first.NumSetBits());
154b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    EXPECT_FALSE(changed);
155b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray  }
156b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray
157b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray  {
158b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    BitVector first(2, true, Allocator::GetMallocAllocator());
159b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    BitVector second(5, true, Allocator::GetMallocAllocator());
160b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    BitVector third(5, true, Allocator::GetMallocAllocator());
161b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray
162b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    second.SetBit(64);
163b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    bool changed = first.UnionIfNotIn(&second, &third);
164b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    EXPECT_EQ(1u, first.NumSetBits());
165b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    EXPECT_TRUE(changed);
166b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray    EXPECT_TRUE(first.IsBitSet(64));
167b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray  }
168b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray}
169b556761d14e8dd0d41f1cc0f7d19726fe3497e8fNicolas Geoffray
1707d275379bf490a87805852129e3fe2e8afe961e7David BrazdilTEST(BitVector, Subset) {
1717d275379bf490a87805852129e3fe2e8afe961e7David Brazdil  {
1727d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    BitVector first(2, true, Allocator::GetMallocAllocator());
1737d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    BitVector second(5, true, Allocator::GetMallocAllocator());
1747d275379bf490a87805852129e3fe2e8afe961e7David Brazdil
1757d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_TRUE(first.IsSubsetOf(&second));
1767d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    second.SetBit(4);
1777d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_TRUE(first.IsSubsetOf(&second));
1787d275379bf490a87805852129e3fe2e8afe961e7David Brazdil  }
1797d275379bf490a87805852129e3fe2e8afe961e7David Brazdil
1807d275379bf490a87805852129e3fe2e8afe961e7David Brazdil  {
1817d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    BitVector first(5, true, Allocator::GetMallocAllocator());
1827d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    BitVector second(5, true, Allocator::GetMallocAllocator());
1837d275379bf490a87805852129e3fe2e8afe961e7David Brazdil
1847d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    first.SetBit(5);
1857d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_FALSE(first.IsSubsetOf(&second));
1867d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    second.SetBit(4);
1877d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_FALSE(first.IsSubsetOf(&second));
1887d275379bf490a87805852129e3fe2e8afe961e7David Brazdil  }
1897d275379bf490a87805852129e3fe2e8afe961e7David Brazdil
1907d275379bf490a87805852129e3fe2e8afe961e7David Brazdil  {
1917d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    BitVector first(5, true, Allocator::GetMallocAllocator());
1927d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    BitVector second(5, true, Allocator::GetMallocAllocator());
1937d275379bf490a87805852129e3fe2e8afe961e7David Brazdil
1947d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    first.SetBit(16);
1957d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    first.SetBit(32);
1967d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    first.SetBit(48);
1977d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    second.SetBit(16);
1987d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    second.SetBit(32);
1997d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    second.SetBit(48);
2007d275379bf490a87805852129e3fe2e8afe961e7David Brazdil
2017d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_TRUE(first.IsSubsetOf(&second));
2027d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    second.SetBit(8);
2037d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_TRUE(first.IsSubsetOf(&second));
2047d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    second.SetBit(40);
2057d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_TRUE(first.IsSubsetOf(&second));
2067d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    second.SetBit(52);
2077d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_TRUE(first.IsSubsetOf(&second));
2087d275379bf490a87805852129e3fe2e8afe961e7David Brazdil
2097d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    first.SetBit(9);
2107d275379bf490a87805852129e3fe2e8afe961e7David Brazdil    EXPECT_FALSE(first.IsSubsetOf(&second));
2117d275379bf490a87805852129e3fe2e8afe961e7David Brazdil  }
2127d275379bf490a87805852129e3fe2e8afe961e7David Brazdil}
2137d275379bf490a87805852129e3fe2e8afe961e7David Brazdil
214f10a25f961eb8029c01c84fe8eabd405055cca37David BrazdilTEST(BitVector, CopyTo) {
215f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil  {
216f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    // Test copying an empty BitVector. Padding should fill `buf` with zeroes.
217f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    BitVector bv(0, true, Allocator::GetMallocAllocator());
218f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    uint32_t buf;
219f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
220f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.CopyTo(&buf, sizeof(buf));
221f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0u, bv.GetSizeOf());
222f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0u, buf);
223f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil  }
224f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
225f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil  {
226f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    // Test copying when `bv.storage_` and `buf` are of equal lengths.
227f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    BitVector bv(0, true, Allocator::GetMallocAllocator());
228f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    uint32_t buf;
229f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
230f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.SetBit(0);
231f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.SetBit(17);
232f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.SetBit(26);
233f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(sizeof(buf), bv.GetSizeOf());
234f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
235f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.CopyTo(&buf, sizeof(buf));
236f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0x04020001u, buf);
237f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil  }
238f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
239f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil  {
240f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    // Test copying when the `bv.storage_` is longer than `buf`. As long as
241f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    // `buf` is long enough to hold all set bits, copying should succeed.
242f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    BitVector bv(0, true, Allocator::GetMallocAllocator());
243f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    uint8_t buf[5];
244f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
245f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.SetBit(18);
246f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.SetBit(39);
247f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_LT(sizeof(buf), bv.GetSizeOf());
248f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
249f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.CopyTo(buf, sizeof(buf));
250f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0x00u, buf[0]);
251f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0x00u, buf[1]);
252f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0x04u, buf[2]);
253f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0x00u, buf[3]);
254f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0x80u, buf[4]);
255f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil  }
256f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
257f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil  {
258f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    // Test zero padding when `bv.storage_` is shorter than `buf`.
259f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    BitVector bv(0, true, Allocator::GetMallocAllocator());
260f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    uint32_t buf[2];
261f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
262f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.SetBit(18);
263f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.SetBit(31);
264f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_GT(sizeof(buf), bv.GetSizeOf());
265f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
266f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    bv.CopyTo(buf, sizeof(buf));
267f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0x80040000U, buf[0]);
268f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil    EXPECT_EQ(0x00000000U, buf[1]);
269f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil  }
270f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil}
271f10a25f961eb8029c01c84fe8eabd405055cca37David Brazdil
272413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian Carlstrom}  // namespace art
273