bitset_test.cpp revision 7ec681f3
1/* 2 * Copyright © 2019 Red Hat 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24#include <gtest/gtest.h> 25#include "util/bitset.h" 26 27TEST(bitset, sizes) 28{ 29 EXPECT_EQ(sizeof(BITSET_WORD), 4); 30 31 BITSET_DECLARE(mask32, 32); 32 BITSET_DECLARE(mask64, 64); 33 BITSET_DECLARE(mask128, 128); 34 35 EXPECT_EQ(sizeof(mask32), 4); 36 EXPECT_EQ(sizeof(mask64), 8); 37 EXPECT_EQ(sizeof(mask128), 16); 38} 39 40TEST(bitset, test_set_clear) 41{ 42 BITSET_DECLARE(mask128, 128); 43 BITSET_ZERO(mask128); 44 45 for (int i = 0; i < 128; i++) { 46 EXPECT_EQ(BITSET_TEST(mask128, i), false); 47 BITSET_SET(mask128, i); 48 EXPECT_EQ(BITSET_TEST(mask128, i), true); 49 BITSET_CLEAR(mask128, i); 50 EXPECT_EQ(BITSET_TEST(mask128, i), false); 51 } 52} 53 54TEST(bitset, test_set_ones) 55{ 56 BITSET_DECLARE(mask128, 128); 57 BITSET_ONES(mask128); 58 59 EXPECT_EQ(BITSET_FFS(mask128), 1); 60 61 for (int i = 0; i < 128; i++) { 62 EXPECT_EQ(BITSET_TEST(mask128, i), true); 63 BITSET_CLEAR(mask128, i); 64 EXPECT_EQ(BITSET_TEST(mask128, i), false); 65 BITSET_SET(mask128, i); 66 EXPECT_EQ(BITSET_TEST(mask128, i), true); 67 } 68} 69 70TEST(bitset, test_basic_range) 71{ 72 BITSET_DECLARE(mask128, 128); 73 BITSET_ZERO(mask128); 74 75 const int max_set = 15; 76 BITSET_SET_RANGE_INSIDE_WORD(mask128, 0, max_set); 77 EXPECT_EQ(BITSET_TEST_RANGE(mask128, 0, max_set), true); 78 EXPECT_EQ(BITSET_TEST_RANGE(mask128, max_set + 1, max_set + 15), false); 79 for (int i = 0; i < 128; i++) { 80 if (i <= max_set) 81 EXPECT_EQ(BITSET_TEST(mask128, i), true); 82 else 83 EXPECT_EQ(BITSET_TEST(mask128, i), false); 84 } 85 BITSET_CLEAR_RANGE(mask128, 0, max_set); 86 EXPECT_EQ(BITSET_TEST_RANGE(mask128, 0, max_set), false); 87 for (int i = 0; i < 128; i++) { 88 EXPECT_EQ(BITSET_TEST(mask128, i), false); 89 } 90} 91 92TEST(bitset, test_bitset_ffs) 93{ 94 BITSET_DECLARE(mask128, 128); 95 BITSET_ZERO(mask128); 96 97 EXPECT_EQ(BITSET_FFS(mask128), 0); 98 99 BITSET_SET(mask128, 14); 100 EXPECT_EQ(BITSET_FFS(mask128), 15); 101 102 BITSET_SET(mask128, 28); 103 EXPECT_EQ(BITSET_FFS(mask128), 15); 104 105 BITSET_CLEAR(mask128, 14); 106 EXPECT_EQ(BITSET_FFS(mask128), 29); 107 108 BITSET_SET_RANGE_INSIDE_WORD(mask128, 14, 18); 109 EXPECT_EQ(BITSET_FFS(mask128), 15); 110} 111 112TEST(bitset, test_range_bits) 113{ 114 BITSET_DECLARE(mask128, 128); 115 BITSET_ZERO(mask128); 116 117 BITSET_SET_RANGE_INSIDE_WORD(mask128, 0, 31); 118 BITSET_SET_RANGE_INSIDE_WORD(mask128, 32, 63); 119 BITSET_SET_RANGE_INSIDE_WORD(mask128, 64, 95); 120 BITSET_SET_RANGE_INSIDE_WORD(mask128, 96, 127); 121 122 EXPECT_EQ(BITSET_TEST_RANGE(mask128, 0, 31), true); 123 EXPECT_EQ(BITSET_TEST_RANGE(mask128, 32, 63), true); 124 EXPECT_EQ(BITSET_TEST_RANGE(mask128, 64, 95), true); 125 EXPECT_EQ(BITSET_TEST_RANGE(mask128, 96, 127), true); 126 for (int i = 0; i < 128; i++) { 127 EXPECT_EQ(BITSET_TEST(mask128, i), true); 128 } 129} 130 131TEST(bitset, test_and) 132{ 133 BITSET_DECLARE(r, 128); 134 BITSET_DECLARE(a, 128); 135 BITSET_DECLARE(b, 128); 136 BITSET_ZERO(r); 137 BITSET_ZERO(a); 138 BITSET_ZERO(b); 139 140 BITSET_AND(r, a, b); 141 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 142 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 143 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 144 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 145 146 147 BITSET_SET_RANGE_INSIDE_WORD(a, 32, 63); 148 BITSET_SET_RANGE_INSIDE_WORD(b, 96, 127); 149 BITSET_AND(r, a, b); 150 151 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 152 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 153 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 154 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 155 156 157 BITSET_SET(a, 80); 158 BITSET_SET(b, 80); 159 BITSET_AND(r, a, b); 160 161 EXPECT_EQ(BITSET_TEST(r, 80), true); 162 163 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 164 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 165 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), true); 166 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 167} 168 169TEST(bitset, test_or) 170{ 171 BITSET_DECLARE(r, 128); 172 BITSET_DECLARE(a, 128); 173 BITSET_DECLARE(b, 128); 174 BITSET_ZERO(r); 175 BITSET_ZERO(a); 176 BITSET_ZERO(b); 177 178 BITSET_OR(r, a, b); 179 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 180 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 181 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 182 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 183 184 185 BITSET_SET_RANGE_INSIDE_WORD(a, 32, 63); 186 BITSET_SET_RANGE_INSIDE_WORD(b, 96, 127); 187 BITSET_OR(r, a, b); 188 189 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 190 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), true); 191 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 192 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), true); 193 194 195 BITSET_SET(a, 80); 196 BITSET_OR(r, a, b); 197 EXPECT_EQ(BITSET_TEST(r, 80), true); 198 199 BITSET_SET(b, 81); 200 BITSET_OR(r, a, b); 201 EXPECT_EQ(BITSET_TEST(r, 81), true); 202 203 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 204 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), true); 205 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), true); 206 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), true); 207} 208 209TEST(bitset, test_not) 210{ 211 BITSET_DECLARE(r, 128); 212 BITSET_ZERO(r); 213 214 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 215 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 216 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 217 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 218 219 BITSET_NOT(r); 220 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), true); 221 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), true); 222 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), true); 223 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), true); 224 225 BITSET_CLEAR_RANGE(r, 32, 63); 226 BITSET_NOT(r); 227 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 228 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), true); 229 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 230 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 231} 232 233TEST(bitset, test_shr_zero) 234{ 235 BITSET_DECLARE(r, 128); 236 237 BITSET_ZERO(r); 238 BITSET_SET(r, 127); 239 240 BITSET_SHR(r, 0); 241 242 EXPECT_EQ(BITSET_TEST(r, 127), true); 243 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 244 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 245 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 246 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), true); 247} 248 249TEST(bitset, test_shl_zero) 250{ 251 BITSET_DECLARE(r, 128); 252 253 BITSET_ZERO(r); 254 BITSET_SET(r, 0); 255 256 BITSET_SHL(r, 0); 257 258 EXPECT_EQ(BITSET_TEST(r, 0), true); 259 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), true); 260 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 261 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 262 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 263} 264 265TEST(bitset, test_shr_walking_bit) 266{ 267 BITSET_DECLARE(r, 128); 268 269 BITSET_ZERO(r); 270 BITSET_SET(r, 127); 271 272 for (int i = 127; i >= 0; i--) { 273 EXPECT_EQ(BITSET_TEST(r, i), true); 274 BITSET_SHR(r, 1); 275 } 276 277 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 278 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 279 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 280 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 281} 282 283TEST(bitset, test_shl_walking_bit) 284{ 285 BITSET_DECLARE(r, 128); 286 287 BITSET_ZERO(r); 288 BITSET_SET(r, 0); 289 290 for (unsigned int i = 0; i < 128; i++) { 291 EXPECT_EQ(BITSET_TEST(r, i), true); 292 BITSET_SHL(r, 1); 293 } 294 295 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 296 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 297 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), false); 298 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 299} 300 301TEST(bitset, test_shr_multiple_words) 302{ 303 BITSET_DECLARE(r, 128); 304 305 BITSET_ZERO(r); 306 BITSET_SET(r, 127); 307 BITSET_SHR(r, 50); 308 309 EXPECT_EQ(BITSET_TEST(r, 127), false); 310 EXPECT_EQ(BITSET_TEST(r, 77), true); 311 312 313 BITSET_ZERO(r); 314 BITSET_SET(r, 127); 315 BITSET_SHR(r, 80); 316 317 EXPECT_EQ(BITSET_TEST(r, 127), false); 318 EXPECT_EQ(BITSET_TEST(r, 47), true); 319 320 321 BITSET_ZERO(r); 322 BITSET_SET(r, 127); 323 BITSET_SHR(r, 126); 324 325 EXPECT_EQ(BITSET_TEST(r, 127), false); 326 EXPECT_EQ(BITSET_TEST(r, 1), true); 327} 328 329TEST(bitset, test_shl_multiple_words) 330{ 331 BITSET_DECLARE(r, 128); 332 333 BITSET_ZERO(r); 334 BITSET_SET(r, 0); 335 BITSET_SHL(r, 50); 336 337 EXPECT_EQ(BITSET_TEST(r, 0), false); 338 EXPECT_EQ(BITSET_TEST(r, 50), true); 339 340 341 BITSET_ZERO(r); 342 BITSET_SET(r, 0); 343 BITSET_SHL(r, 80); 344 345 EXPECT_EQ(BITSET_TEST(r, 0), false); 346 EXPECT_EQ(BITSET_TEST(r, 80), true); 347 348 349 BITSET_ZERO(r); 350 BITSET_SET(r, 0); 351 BITSET_SHL(r, 126); 352 353 EXPECT_EQ(BITSET_TEST(r, 0), false); 354 EXPECT_EQ(BITSET_TEST(r, 126), true); 355} 356 357TEST(bitset, test_shr_two_words) 358{ 359 BITSET_DECLARE(r, 64); 360 361 BITSET_ZERO(r); 362 BITSET_SET(r, 63); 363 BITSET_SHR(r, 50); 364 365 EXPECT_EQ(BITSET_TEST(r, 63), false); 366 EXPECT_EQ(BITSET_TEST(r, 13), true); 367 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), true); 368 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), false); 369} 370 371TEST(bitset, test_shl_two_words) 372{ 373 BITSET_DECLARE(r, 64); 374 375 BITSET_ZERO(r); 376 BITSET_SET(r, 0); 377 BITSET_SHL(r, 50); 378 379 EXPECT_EQ(BITSET_TEST(r, 0), false); 380 EXPECT_EQ(BITSET_TEST(r, 50), true); 381 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 382 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), true); 383} 384 385TEST(bitset, test_setrange_across_word_boundary) 386{ 387 BITSET_DECLARE(r, 128); 388 BITSET_ZERO(r); 389 390 BITSET_SET_RANGE(r, 62, 65); 391 392 EXPECT_EQ(BITSET_TEST_RANGE(r, 0, 31), false); 393 EXPECT_EQ(BITSET_TEST_RANGE(r, 32, 63), true); 394 EXPECT_EQ(BITSET_TEST_RANGE(r, 64, 95), true); 395 EXPECT_EQ(BITSET_TEST_RANGE(r, 96, 127), false); 396 397 EXPECT_EQ(BITSET_TEST(r, 61), false); 398 399 for (int i = 62; i <= 65; i++) 400 EXPECT_EQ(BITSET_TEST(r, i), true); 401 402 EXPECT_EQ(BITSET_TEST(r, 66), false); 403} 404